Le pid d'un SIGCHILD - C++ - Programmation
Marsh Posté le 11-01-2006 à 22:47:55
samycookie a écrit : Bonjour à tous, |
Dès le "fork()" le père stocke le pid créé dans un tableau des pid défini en global.
Dans ta fonction de déroutage, tu balayes le tableau avec "wait(p" ou "waitpid()" et tu identifies le pid qui n'y est plus.
Marsh Posté le 11-01-2006 à 22:53:33
Et s'il utilise juste wait dans le handler du SIGCHLD, cela lui permet de récupérer le pid du fils qui vient de mourir, non ?
http://www.linux-kheops.com/doc/ma [...] ait.2.html
Par contre il faut faire attention dans le cas ou plusieurs fils meurent en même temps :
Citation : On some flavors of Unix, the SIGCHLD signal handler is called if |
Marsh Posté le 12-01-2006 à 09:17:56
moi je te conseille avant tout de toujour utiliser waitpid plutôt que wait.
Marsh Posté le 12-01-2006 à 16:55:08
BILAN
- Sve@r : J'ai utilisé ta méthode, et après en avoir bavé parce que je faisais n'importe quoi avec waitpid(). J'utilisais celle avec en deuxieme parametre la variable int & Status, qui renvoie des infos sur la mortdu fils, et Status(WIFEXITED) selon le man devrait m'informer de sa mort ou non, et ben ca renvoie nimporte nawak ^^ En fait suffisait juste de prendre les valeurs de retour qui étaient à 0 si le fils était encore vivant, en gros prise de tête pour rien. Au final, ca marche au poil
- fat : je pouvait pas récupérer le pid si facilement au vu du fait qu'elle n'était pas directement capturé par un waitpid, mais par une fonction de déroutage
- Taz : en effet, waitpid cay mieux ^^
Merci de vos réponses
Marsh Posté le 12-01-2006 à 18:04:42
Je suppose que lorsque tu parle de fonction de déroutage, tu parles de fonction handler pour le signal SIGCHLD, un handler mis en place en utilisant la fonction signal.
si c'est bien le cas, tu peux récupérer le pid du fils mort ayant généré le SIGCHLD par un wait dans le handler
exemple :
...
signal(SIGCHLD,handler_sigchld);
...
void handler_sigchld(int truc)
{
pid_t pid_fils;
pid_fils=wait(NULL);
...
}
Marsh Posté le 13-01-2006 à 00:46:05
samycookie a écrit : BILAN |
C'est plus cat. C que C++. Mais je vois pas la difficulté...
|
=> fat, ton idée est bonne mais que faire après de ton pid ? Tu peux pas le renvoyer puisque ton handler est impérativement de type "void"...
Marsh Posté le 13-01-2006 à 10:22:01
Dans le handler, tu peux en faire ce que tu veux, tu peux par exemple le supprimer de la liste des fils.
Mais je pense aussi qu'utiliser waitpid est plus sur, notamment avec l'option WNOHANG, ce qui permet à waitpid de retourner tout de suite sans attendre la mort du fils, ce qui bloquerait le programme.
Marsh Posté le 14-01-2006 à 23:18:16
fat a écrit : Mais je pense aussi qu'utiliser waitpid est plus sur, notamment avec l'option WNOHANG, ce qui permet à waitpid de retourner tout de suite sans attendre la mort du fils, ce qui bloquerait le programme. |
Exact. WNOHANG est un bon truc !!!
Marsh Posté le 11-01-2006 à 22:17:00
Bonjour à tous,
J'utilise les signaux en C++, et en particulier je déroute l'un de ceux-ci, SIGCHLD, à l'aide de la fonction sigaction. (SIGCHLD est le signal qui indique la mort d'un processus fils)
Or dans ma fonction de déroutage, j'aurais aimé connaitre le PID du processus fils mort, et là je ne vois pas comment faire.
Si qqun aurait une solution, merci d'avance...