[英]wait for children and grand-children
你怎么能等到所有的孩子和大孩子都退出,而不是在信号处理器中阻挡? 这是我到目前为止的尝试。
#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以便在剩余描述符上read
。 当最后一个后代终止时,管道的读取结束将提供EOF。
这种策略无法保证 - 孩子或孙子可能会谨慎地关闭继承的文件描述符 - 但它通常运行良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.