等待孩子和大孩子们

你怎么能等到所有的孩子和大孩子都离开了,没有阻挡在一个信号处理程序? 这是我迄今的尝试。

#include <signal.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int run = 1; void handler(int sig, siginfo_t *info, void *uap) { int exit_code; printf("sigchld pid %d\n", info->si_pid); pid_t pid = waitpid(-1, &exit_code, 0); if (pid == -1) { perror("waitpid()\n"); } else { printf("waitpid returned %d\n", pid); } // set run = 0 when all children exit printf("end of sigchild handler\n"); } void main() { struct sigaction chld; chld.sa_sigaction = handler; chld.sa_flags = SA_NOCLDSTOP | SA_SIGINFO; sigaction(SIGCHLD, &chld, NULL); //procmask sigchld? if (!fork ()) { if (!fork ()) { sleep(2); printf ("grand-son exit: %d\n", getpid()); exit (0); } sleep(1); printf ("son exit: %d\n", getpid()); exit (0); } while(run) sleep(1); printf("ciao\n"); } 

尽管SIGCHLD和waitpid等只适用于直系子系统,但在UNIX系统上,通常可以用从父代到子代传递给孙代的继承资源“欺骗”一小部分,并在进程终止时关闭。

例如,原始进程可能会打开一个pipe ,并可能将它的读取端设置为close-on-exec ,以便子孙继承写入端。 当原始进程准备好等待所有后代终止时,它将关闭其管道的写入端,并且阻塞地read s或者为了在其余描述符上的可读性而select s。 当最后的后代已经终止时,管道的读端将传送一个EOF。

这种策略是不能保证的 – 孩子或孙子可能谨慎地关闭继承的文件描述符 – 但它通常工作得很好。

你需要的是等待函数:wait,waitpid – 等待子进程停止或终止。 编辑:nope 🙂