杀死父级的所有子进程,但让父级保持活动状态

时间:2013-08-25 20:52:48

标签: c unix process

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

截至目前,我正在使用kill(-1 * parentPid,SIGKILL),但这会导致我的父母及其子女一直死亡。

3 个答案:

答案 0 :(得分:3)

实现此目的的一种方法是提供一些可以捕获的信号(不是SIGKILL)。然后,安装一个信号处理程序,检测当前进程是否是父进程,如果它不是父进程,则调用_exit()

您可以使用SIGUSR1SIGUSR2,也可以使用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)。这可能会添加代码行,但您不需要检测进程是信号处理函数中的父代或子代。