web-dev-qa-db-fra.com

waitpid, wnohang, wuntraced. Comment les utiliser

Je suis un peu confus. Si je comprends bien, waitpid avec un pid de -1 signifie que j'attends que tous les enfants aient fini mais si j'ajoute une option au waitpid de WNOHANG, cette option dit de quitter immédiatement si aucun n'a fini ... Cela semble extrêmement déroutant.

Pourquoi devrais-je dire à l'ordinateur d'attendre la fin des processus enfants, puis immédiatement après lui dire de quitter immédiatement si aucun des enfants n'a terminé?

Quelqu'un peut-il expliquer cette option et les options WUNTRACED? Je ne sais pas ce que cela signifie d'être tracé.

13
8this

Si vous passez -1 Et WNOHANG, waitpid() vérifiera s'il existe des enfants zombies. Si oui, l'un d'eux est récolté et son état de sortie est renvoyé. Sinon, 0 Est renvoyé (s'il existe des enfants non terminés) ou -1 Est renvoyé (sinon) et ERRNO est défini sur ECHILD (aucun enfant processus). Ceci est utile si vous voulez savoir si l'un de vos enfants est décédé récemment sans avoir à attendre que l'un d'eux meure. C'est assez utile à cet égard.

L'option WUNTRACED est documentée comme ci-dessous, je n'ai rien à ajouter à cette description:

WUNTRACED Le statut de tous les processus enfants spécifiés par pid qui sont arrêtés et dont le statut n'a pas encore été signalé depuis leur arrêt doit également être signalé au processus demandeur.

Lisez la page waitpid de POSIX pour plus de détails.

5
fuz

Vous utilisez généralement WNOHANG et WUNTRACED dans différents cas.

Cas 1: Supposons que vous ayez un processus qui génère un groupe d'enfants et doit faire d'autres choses pendant que les enfants courent. Ces enfants quittent parfois ou sont tués, mais le noyau conservera leur état de sortie jusqu'à ce qu'un autre processus le réclame via wait () ou waitpid (). Ainsi, votre processus parent doit appeler wait ()/waitpid () à l'occasion pour laisser le noyau se débarrasser des restes de l'enfant. Mais nous ne voulons pas wait ()/waitpid () to block, parce que, dans ce cas, notre processus a d'autres choses à faire. Nous voulons juste collecter le statut d'un processus mort si il y en a. C'est à ça que sert WNOHANG. Il empêche wait ()/waitpid () de se bloquer afin que votre processus puisse continuer avec d'autres tâches. Si un enfant est décédé, son pid sera retourné par wait ()/waitpid () et votre processus peut agir en conséquence. Si rien n'est mort, le pid retourné est 0.

Cas 2: Supposons que votre processus parent, à la place, veuille faire rien pendant que les enfants courent. Vous ne voulez pas simplement lui faire faire une boucle for-twidling, vous utilisez donc un wait ()/waitpid () normal sans WNOHANG. Votre processus est retiré de la file d'attente d'exécution jusqu'à ce que l'un des enfants décède. Mais que faire si l'un de vos enfants est arrêté via un SIGSTOP? Votre enfant ne travaille plus sur la tâche que vous lui avez assignée, mais le parent attend toujours. Donc, vous avez une impasse, dans un sens, à moins que l'enfant ne soit poursuivi par un moyen extérieur à votre parent et à cet enfant. WUNTRACED permet à votre parent d'être renvoyé de wait ()/waitpid () si un enfant obtient arrêté ainsi que de quitter ou d'être tué. De cette façon, votre parent a la possibilité de lui envoyer un SIGCONT pour le continuer, le tuer, assigner ses tâches à un autre enfant, peu importe.

32
Jemenake