什么是杀死父母的所有过程而不是父母的最佳方法?假设我有一个未确定数量的子进程,我已经分叉并且在给定的警报上,在我的信号处理程序中,我想杀死我所有的子进程但是由于各种原因让自己运行。
截至目前,我正在使用kill(-1 * parentPid,SIGKILL),但这会导致我的父母及其子女一直死亡。
答案 0 :(得分:3)
实现此目的的一种方法是提供一些可以捕获的信号(不是SIGKILL
)。然后,安装一个信号处理程序,检测当前进程是否是父进程,如果它不是父进程,则调用_exit()
。
您可以使用SIGUSR1
或SIGUSR2
,也可以使用SIGQUIT
。
我已经说明了这种技术here。
(可选)(如Lidong所示),父进程可以在发出SIG_IGN
命令之前对信号使用kill()
。
signal(SIGQUIT, SIG_IGN);
kill(-parent_pid, SIGQUIT);
答案 1 :(得分:2)
您可以在派生时间将子进程设置为新的进程组,并且要杀死子进程及其后代时,可以使用 killpg ,示例代码为:
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
void parent(pid_t pid) {
killpg(pid, SIGKILL);
}
void child(void) {
if (-1 == setsid())
return;
while(1) {
sleep(1);
printf("child\n");
}
}
int main() {
pid_t pid;
switch ((pid=fork())) {
case 0: // child
child();
break;
default: // parent
getchar();
getchar();
parent(pid);
}
return 0;
}
答案 2 :(得分:0)
Jxh的回答很好。然而,也许你可以在signal hander
之后为每个子进程提供一个fork
并让它调用exit
函数。然后你给父母signal hander
并让它ignore
信号(如SIGUSR1
)。这可能会添加代码行,但您不需要检测进程是信号处理函数中的父代或子代。