5

杀死父进程而不是父进程的最佳方法是什么?假设我有不确定数量的子进程,我已经派生了一个给定的警报,在我的信号处理程序中,我想杀死我所有的子进程,但由于各种原因让自己保持运行。

截至目前,我正在使用 kill(-1*parentPid, SIGKILL) 但这会杀死我的父母及其孩子。

4

3 回答 3

5

实现这一点的一种方法是传递一些可以被捕获的信号(不是SIGKILL)。然后,安装一个信号处理程序,检测当前进程是否为父进程,_exit()如果不是父进程则调用。

您可以使用SIGUSR1or SIGUSR2,或者也许SIGQUIT

我已经说明了这种技术here

可选地(如 Lidong 建议的那样),父进程可以SIG_IGN在发出kill()命令之前使用信号。

signal(SIGQUIT, SIG_IGN);
kill(0, SIGQUIT);
于 2013-08-25T22:09:27.197 回答
3

您可以在 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;
}
于 2020-01-16T08:47:14.107 回答
1

Jxh 的回答很好。但是,也许您可​​以signal hander在之后为每个子进程提供一个fork并让它调用exit函数。然后你给一个signal handerfor parent 并让它ignore发出信号(比如SIGUSR1)。这可能会添加代码行,但您不需要在信号处理函数中检测进程是父进程还是子进程。

于 2013-08-25T22:28:28.390 回答