Est-il possible de différencier les processus enfants créés par différentes fonctions fork() dans un programme.fork() dans une fourche()
global variable i;
SIGCHLD handler function()
{
i--;
}
handle()
{
fork() --> FORK2
}
main()
{
while(1)
{
if(i<5)
{
i++;
if((fpid=fork())==0) --> FORK1
handle()
else (fpid>0)
.....
}
}
}
Est-il possible de différencier les processus enfants créés par FORK1 et FORK2? parce que j'essaye de décrémenter la valeur de la variable globale 'i' dans la fonction de gestionnaire SIGCHLD et il devrait être décrémenté seulement pour les processus créés par FORK1.
J'ai essayé d'utiliser un tableau et enregistrez l'identificateur de processus de l'enfant processus créés par FORK1 et cela est fait par le processus parent. Je décrémenter la valeur de « i » que si l'identifiant du processus enfant mort est dans le tableau ...
Mais je faisais face à un problème avec le scénario suivant
child1, Parent1, child1 tué, child2, child2 tués, parent2
Encas de child1 puisqu'il est tué après Parent1 le tableau est mis à jour correctement.
Mais dans le cas de child2 qui est tué avant que sa valeur pid ne soit mise à jour par parent2 dans le tableau? À l'intérieur de la fonction de gestionnaire de signal SIGCHLD puisque la valeur PID enfant2 ne figure pas dans le tableau, la valeur «i» ne sera pas décrémentée en conséquence.
Alors, y a-t-il une meilleure solution pour ce problème?
duplication possible: http://stackoverflow.com/questions/340283/avoiding-a-fork-sigchld-race-condition – jschmier
Hmmm ... en fait je ne l'avais pas trouvé plus tôt .. – codingfreak
Comment définissez-vous le gestionnaire de signal ? Avec 'signal',' bsd_signal', ou 'sigaction'? – Random832