杀死父进程而不是父进程的最佳方法是什么?假设我有不确定数量的子进程,我已经派生了一个给定的警报,在我的信号处理程序中,我想杀死我所有的子进程,但由于各种原因让自己保持运行。
截至目前,我正在使用 kill(-1*parentPid, SIGKILL) 但这会杀死我的父母及其孩子。
实现这一点的一种方法是传递一些可以被捕获的信号(不是SIGKILL
)。然后,安装一个信号处理程序,检测当前进程是否为父进程,_exit()
如果不是父进程则调用。
您可以使用SIGUSR1
or SIGUSR2
,或者也许SIGQUIT
。
我已经说明了这种技术here。
可选地(如 Lidong 建议的那样),父进程可以SIG_IGN
在发出kill()
命令之前使用信号。
signal(SIGQUIT, SIG_IGN);
kill(0, SIGQUIT);
您可以在 fork 时为子进程设置一个新的进程组,当您想杀死子进程及其后代时,您可以使用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;
}
Jxh 的回答很好。但是,也许您可以signal hander
在之后为每个子进程提供一个fork
并让它调用exit
函数。然后你给一个signal hander
for parent 并让它ignore
发出信号(比如SIGUSR1
)。这可能会添加代码行,但您不需要在信号处理函数中检测进程是父进程还是子进程。