其他分享
首页 > 其他分享> > 使用`sigaction(2)`忽略`SIGCHLD`信号有什么用?

使用`sigaction(2)`忽略`SIGCHLD`信号有什么用?

作者:互联网

事实证明,我们可以通过指定由sigaction()忽略的SIGCHLD信号来阻止出现僵尸进程(即父进程不等待()使用_exit()).但是,无论如何,似乎默认会忽略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()(或变量)以获得其终止状态.

但是如果你明确地使用处置SIG_IGN调用sigaction(),那么它会导致它不会将孩子变成僵尸 – 当孩子退出它时会立即获得.见https://stackoverflow.com/a/7171836/1491895

获取此行为的POSIX方法是使用handler = SIG_DFL和包含SA_NOCLDWAIT的标志调用sigaction.这是2.6以来的Linux.

标签:c-3,linux,process,signals,c99
来源: https://codeday.me/bug/20190516/1114681.html