我有一个父进程可能产生许多子进程的情况 . 我想要实现的是,如果父进程被终止或者它退出,那么它的所有子进程应该与父进程终止 .
在帖子(下面的链接)中,我找到了通过让父进程成为组长来存档的建议 . 如果我理解正确,这也是过程组的主要目的 . 我对吗?
Post也提到了prctl(PR_SET_PDEATHSIG,SIGHUP);和其他一些方法,但它们是以太网操作系统特定的,否则不会如此优雅 .
我已经写了一个小的演示来试图更好地理解事物,但它并不像我期望的那样工作 . 我究竟做错了什么?
//https://www.andrew.cmu.edu/course/15-310/applications/homework/homework4/terminalgroups1.html
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <stddef.h>
#include <errno.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <sys/termios.h>
int main()
{
int status;
int cpid;
int ppid;
ppid = getpid();
printf("parent: %d\n", ppid);
if (!(cpid=fork()))
{
printf("child: %d\n", getpid());
if(setpgid(0,ppid) == -1)
printf("child setpgid errno %s\n", strerror(errno));
else
printf("child gid %d\n", getpgid(0));
pause();
printf("child exited\n");
exit (-1);
}
if (cpid < 0)
exit(-1);
setpgid(0, ppid);
if(setpgid(0,0) == -1)
printf("parent setpgid erno %s\n", strerror(errno));
else
printf("parrent gid %d\n", getpgid(0));
sleep(7);
printf("parent exit\n");
exit(0);
}
这篇文章涉及以下建议:* How to make child process die after parent exits?
2 回答
请注意,仅在非常有限的情况下才会向子进程发送信号 . POSIX说:
controlling process的定义是:
通常,您的进程不会成为 Build 与控制终端(通常是您的shell)连接的会话负责人 .
如果POSIX的另一部分适用,请通知我 .
我对你的代码进行了一些测试(
termkids.c
):样本输出:
请注意,在父进程完成后几分钟发送了
kill 17702
.您可以使用atexit注册一个函数,该函数将SIGHUP信号发送到具有相同进程组ID的所有进程 . 当父母退出时,这会产生向所有孩子发送信号的预期效果 . 但是,请注意子项中的SIGHUP信号处理程序会导致子项立即退出,而不会从pause()返回并打印子项退出消息 .