【发布时间】:2014-06-30 17:41:12
【问题描述】:
我有一个父进程可能会产生许多子进程的情况。 我想要实现的是,如果父进程被杀死或退出,那么它的所有子进程都应该与父进程一起终止。
在帖子(下面的链接)中,我发现了通过使父进程成为组长来存档此内容的建议。
如果我理解正确,这也是流程组的主要目的。我说的对吗?
帖子还提到 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?
【问题讨论】:
-
如何它没有按您期望的方式工作?你期望做什么?
-
父进程在 7 秒后终止,但子进程仍然存在并被 init 进程孤立。我希望孩子收到一些信号并与父母终止。
-
man7.org/linux/man-pages/man3/exit.3.html 说但我不知道这在这种情况下是否真实:如果进程是会话领导者并且其控制终端是会话的控制终端,那么每个进程在这个控制终端的前台进程组被发送一个 SIGHUP 信号,并且终端与这个会话解除关联,允许它被一个新的控制进程获取。
-
你有没有想过在分叉之前调用
setsid,以确保父进程是进程组负责人并且你有一个新的会话? -
谢谢,我会试试的。