Imaginez que j'ai un processus qui commence plusieurs processus enfant. Le parent a besoin de savoir quand un enfant quitte.
Je peux utiliser waitpid
, mais alors, si/lorsque le parent doit quitter je n'ai aucun moyen de dire le thread est bloqué en waitpid
à la sortie gracieusement et se joindre à elle. C'est agréable d'avoir des choses à nettoyer eux-mêmes, mais peut-être pas que les grandes d'un accord.
Je peux utiliser waitpid
avec WNOHANG
, puis le sommeil pour quelques temps arbitraire pour éviter une longue attente. Toutefois, alors je ne peux savoir si un enfant est sorti de chaque tellement souvent. Dans mon cas, il peut ne pas être super critique que je sais que quand un enfant quitte tout de suite, mais j'aimerais savoir le plus tôt possible...
Je peux utiliser un gestionnaire de signal pour SIGCHLD
, et dans le gestionnaire de signal faire ce que j'allais faire quand un enfant quitte, ou envoyer un message à un autre thread pour faire une action. Mais à l'aide d'un gestionnaire de signal code le flux de un peu le code.
Ce que j'aimerais vraiment faire est d'utiliser waitpid
sur certains délai, disons 5 secondes. Depuis la sortie du processus n'est pas une critique de l'opération, je peux paresseusement signal le fil à la sortie, tout en ayant encore il s'est bloqué en waitpid
le reste du temps, toujours prêt à réagir. Il y a un appel dans linux? Des solutions de rechange, lequel est le meilleur?
EDIT:
Une autre méthode basée sur les réponses serait de bloquer SIGCHLD
dans toutes les discussions avec pthread
\ _sigmask()
. Puis dans un thread, l'appel, sigtimedwait()
alors que la recherche d' SIGCHLD
. Cela signifie que je peux de temps sur cet appel, et de vérifier si le fil de sortie, et si non, rester bloqué dans l'attente du signal. Une fois un SIGCHLD
est livré à ce fil, nous pouvons réagir immédiatement, et dans la ligne de l'attente d'un thread, sans l'aide d'un gestionnaire de signal.