Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/10/2016, à 15:12

DonutMan75

[C] Pseudo-code d'un serveur basique

Bonjour à tous,
dans la continuité d'une question que j'ai posée hier sur ce forum, j'aimerais vous solliciter concernant l'architecture d'un serveur basique en C.

Voilà l'idée :

  • Le programme principal (le Père) attends l'arrivée d'une requête quelconque.

  • Lorsqu'il reçoit cette requête, il fork() afin que :

  1 - Son fils s'occupe de traiter la requête (temps de calcul potentiellement long), puis meurt
  2 - Il retourne écouter en attente d'une nouvelle requête

Dans ma précédente discussion, j'avais remarqué que les fils passaient en mode Zombi tant qu'ils n'avaient pas été "acquittés" par le Pere (via les fonctions wait() ou waitpid()).

L'attente d'une requête étant BLOQUANT pour le processus, il me semble que la façon naturelle de coder tout ça ressemblerait à :

nson = 0; // Nombre de fils à un instant t

while (1)
	{
	attente_requette() // BLOQUANT
	pid = fork()
	
	if (pid == 0) // Je suis le fils
		traiter_requete();
		exit(0);
	else // Je suis le pere
		nson++;
	}

Il faudra également qu'on ait une fonction decrementer() qui sera appelée à chaque réception d'un signal SIGCHLD. Elle ressemblerait à :

void decrementer() // Il y a au moins un fils ZOMBIE en attente d'être terminé
	{
	
	while ( ( pid_dead = waitpid(-1, &status, WNOHANG) ) > 0 ) // On prend connaissance de la mort des fils
		{
		nson--
		}
	}

J'utilise ici l'option WNOHANG car je veux absolument éviter de bloquer le serveur.

Qu'en pensez-vous ? Est-ce la bonne façon de procéder ? Feriez-vous la même architecture ?

Merci d'avance !

Donut.

Hors ligne