bad11 a écrit :
Coucou !
Voila je dois développer un programme perso qui est un serveur qui attend des connections sur le port prédéfini et qui envoie un fichier texte au client qui se connecte , puis déconnecte le client.
Le serveur est fait pour ne jamais s'arreter(boucle infinie) et pour marcher en parallele (traiter plusieurs client en meme tps).
Tres scolaire et tres simple en théorie .
Mon probleme :
Je cré un processus fils qui traitera la demande d'un client qui se connecte (avec fork() ).
Mon probleme est que quand je lance mon serveur, chaque processus fils terminé laisse un "zombie" une trace de lui dans la liste des processus.
Il faudrait que le programme principal, donc le pere attende la fin du fils qui traite la demande mais là cela ne serait plus un serveur parallele.
Comment puis je faire? je développe en C sous Linux.
|
Quand un fils meurt, il reste à l'état de "zombie" tant que son père n'a pas consulté son état. Un des moyens de connaître l'état d'un fils est d'utiliser la primitive "wait".
Comment on s'en sert
1) tu déclares dans le père une variable style "int etat"
2) tu appelles dans le père "wait(&etat)"
Qu'est-ce qu'il va se passer
Si le fils est encore en vie, ton appel à "wait()" dans le père va bloquer ce dernier jusqu'à ce que le fils se termine.
Dès que le fils meurt (ou s'il est mort avant l'appel à "wait()" ), cet appel est débloqué et la fonction renvoie le pid du fils mort (utile dans le cas de plusieurs fils).
Ensuite, ta variable "etat" contiendra la cause de la mort du fils
- si le fils s'est terminé par "exit(n)", la valeur "n" sera dans le premier octet de la variable "etat" et l'autre octet sera à 0
- si le fils s'est terminé par "kill(n)", la valeur "n" sera placée dans les sept derniers bits de "etat". De plus, le 8° bit sera à "1" si le kill a provoqué la création d'un fichier core.
Tu peux utiliser les macros "WIFEXITED()", "WIFSIGNALED()", "WEXITSTATUS()" et "WTERMSIG()" définies dans "sys/wait.h" en y passant ta variable "etat". Ces macros vont tester et/ou extaire de "etat" l'octet qui va bien pour vérifier si la mort a été due à "exit" ou "kill" et récupérer la valeur de "exit" ou de "kill".
Le prpblème de "wait" est que c'est bloquant. De plus, tu ne peux pas cibler quel fils tu attends. Cependant, il y a des dérivés de "wait()" comme "waitpid().
Cette primitive est intéressante pour toi car elle permet de cibler quel processus on attend, et elle possède un paramètre "option" dans lequel tu peux y mettre la macro "WNOHANG" (mode non-bloquant) => ton serveur reste parallèle => la fonction renvoie "0" si le fils n'est pas encore fini
Si c'est trop compliqué ou trop lourd, tu peux alors utiliser des thread mais ça, je ne sais pas le faire...
Message édité par Sve@r le 11-10-2004 à 21:29:54
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.