235 votes

Comment faire de l'enfant le processus de mourir après parent issues de secours?

Supposons que j'ai un processus qui engendre exactement un processus enfant. Maintenant, quand le processus parent quitte pour quelque raison que ce soit (normalement ou anormalement, par tuer, ^C, affirmer l'échec ou quoi que ce soit d'autre) je veux le processus de l'enfant de mourir. Comment le faire correctement?


Certains même question sur stackoverflow:


Certains même question sur stackoverflow pour Windows:

202voto

qrdl Points 17813

Enfant peut demander à noyau de livrer SIGHUP (ou autre signal) lorsque la mère meurt en spécifiant l'option PR_SET_PDEATHSIG en prctl() syscall comme ceci:

prctl(PR_SET_PDEATHSIG, SIGHUP);

Voir man 2 prctl pour plus de détails.

Edit: C'est Linux

72voto

Schof Points 2338

Je suis en train d'essayer de résoudre le même problème, et depuis mon programme doit s'exécuter sur OS X, Linux, la seule solution n'a pas fonctionné pour moi.

Je suis venu à la même conclusion que les autres personnes sur cette page -- il n'y a pas compatibles POSIX moyen de la notification d'un enfant lorsque l'un des parents meurt. J'ai donc kludged la prochaine meilleure chose, l'enfant du sondage.

Lorsque l'un des parents meurt (pour quelque raison) le parent de l'enfant devient de processus 1. Si l'enfant simplement des sondages régulièrement, il peut vérifier si son parent est de 1. Si elle l'est, l'enfant doit quitter.

Ce n'est pas grand, mais il fonctionne, et c'est plus facile que le socket TCP/lockfile interrogation solutions proposées ailleurs sur cette page.

33voto

dmckee Points 50318

J'ai accompli dans le passé par l'exécution de "l'original" code "enfant" et le "a donné naissance à" code "parent" (qui est: vous inversez le sens habituel de l'essai après fork()). Ensuite piège SIGCHLD dans la "a donné naissance à" code...

Peut-être pas possible dans votre cas, mais mignon quand il fonctionne.

31voto

Phil Rutschman Points 201

Si vous n'êtes pas en mesure de modifier le processus de l'enfant, vous pouvez essayer quelque chose comme ce qui suit:

int pipes[2];
pipe(pipes)
if (fork() == 0) {
    close(pipes[1]); /* Close the writer end in the child*/
    dup2(0, pipes[0]); /* Use reader end as stdin */
    exec("sh -c 'set -o monitor; child_process & read dummy; kill %1'")
}

close(pipes[0]); /* Close the reader end in the parent */

Cela va de l'enfant à partir d'un shell, processus de travail control est activé. Le processus de l'enfant qui est engendré en arrière-plan. Le shell attend pour un retour à la ligne (ou un EOF) puis tue l'enfant.

Lorsque le parent décède, peu importe ce que la raison, elle fermera ses fin de la pipe. L'enfant shell obtiendrez un EOF à partir de la lecture et de procéder à tuer le backgrounded processus enfant.

9voto

Maxim Yegorushkin Points 29380

Vous pouvez rendre le processus parent d'un groupe leader en appelant setpgid():

Le setpgid() fonction de groupe de processus ensemble pour le but de la signalisation, de placement au premier plan ou en arrière-plan, et les autres actions de contrôle.

Et lorsque le chef de groupe se termine:

Si le processus est un processus de contrôle, le signal SIGHUP est envoyé à chaque processus au premier plan, le groupe de processus de contrôle terminal appartenant au processus appelant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X