gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:18:36 26 4
gpt4 key购买 nike

事实证明,我们可以通过指定来防止出现僵尸进程(即,其父进程不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 方法是通过使用 handler = SIG_DFL 和包含 SA_NOCLDWAITflags 调用 sigaction .自 2.6 以来,这是在 Linux 中。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com