Certaines affiches ont déjà mentionné les pipes et kqueue
. En fait, vous pouvez également créer une paire de sockets de domaine Unix connectés par l' socketpair()
appel. Le type de socket doit êtreSOCK_STREAM
.
Supposons que vous ayez les deux descripteurs de fichier socket fd1, fd2. Maintenant, fork()
pour créer le processus enfant, qui héritera des fds. Dans le parent, vous fermez fd2 et chez l'enfant, vous fermez fd1. Maintenant, chaque processus peut poll()
ouvrir le fd restant de sa propre extrémité pour l' POLLIN
événement. Tant que chaque côté n'a pas explicitement close()
son fd pendant la durée de vie normale, vous pouvez être assez sûr qu'un POLLHUP
indicateur doit indiquer la terminaison de l'autre (que ce soit propre ou non). Dès notification de cet événement, l'enfant peut décider quoi faire (par exemple mourir).
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <poll.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
int sv[2]; /* sv[0] for parent, sv[1] for child */
socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
pid_t pid = fork();
if ( pid > 0 ) { /* parent */
close(sv[1]);
fprintf(stderr, "parent: pid = %d\n", getpid());
sleep(100);
exit(0);
} else { /* child */
close(sv[0]);
fprintf(stderr, "child: pid = %d\n", getpid());
struct pollfd mon;
mon.fd = sv[1];
mon.events = POLLIN;
poll(&mon, 1, -1);
if ( mon.revents & POLLHUP )
fprintf(stderr, "child: parent hung up\n");
exit(0);
}
}
Vous pouvez essayer de compiler le code de validation de principe ci-dessus et l'exécuter dans un terminal comme ./a.out &
. Vous avez environ 100 secondes pour expérimenter la destruction du PID parent par divers signaux, ou il se fermera simplement. Dans les deux cas, vous devriez voir le message "enfant: parent raccroché".
Par rapport à la méthode utilisant le SIGPIPE
gestionnaire, cette méthode ne nécessite pas d'essayer l' write()
appel.
Cette méthode est également symétrique , c'est-à-dire que les processus peuvent utiliser le même canal pour surveiller leur existence mutuelle.
Cette solution appelle uniquement les fonctions POSIX. J'ai essayé cela sous Linux et FreeBSD. Je pense que cela devrait fonctionner sur d'autres Unix, mais je n'ai pas vraiment testé.
Voir également:
unix(7)
des pages de manuel Linux, unix(4)
FreeBSD, poll(2)
, socketpair(2)
, socket(7)
sous Linux.