事实证明,我们可以通过指定 wait() 信号被其父进程用 _exit() 忽略来防止出现僵尸进程(即,其父进程没有将其 SIGCHLD 指定为 sigaction() 的进程)。但是,似乎 SIGCHLD 无论如何默认都会被忽略。这是怎么工作的?

int main (void) {
    struct sigaction sa;
    sa.sa_handler = SIG_IGN; //handle signal by ignoring
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if (sigaction(SIGCHLD, &sa, 0) == -1) {
        perror(0);
        exit(1);
    }
    int pid = fork();
    if (pid == 0) { //child process
        _exit(0);
    }
    do_something(); //parent process
    return 0;
}

最佳答案

SIGCHLD 的默认行为是丢弃信号,但子进程保持僵尸进程,直到父进程调用 wait()(或变体)以获取其终止状态。

但是,如果您显式调用 sigaction() 的处置 SIG_IGN ,这会导致它不会将 child 变成僵尸——当 child 退出时,它会立即被收割。见 https://stackoverflow.com/a/7171836/1491895

获得此行为的 POSIX 方法是使用 sigaction 和包含 handler = SIG_DFLflags 调用 SA_NOCLDWAIT 。从 2.6 开始,这是在 Linux 中。

关于c - 用 `SIGCHLD` 忽略 `sigaction(2)` 信号有什么用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40601337/

10-12 04:30