gpt4 book ai didi

c - 我该如何处理 SIGCHLD?

转载 作者:太空狗 更新时间:2023-10-29 16:40:00 25 4
gpt4 key购买 nike

我需要正确处理 SIGCHLD。我如何将它与我现有的代码一起使用?目前我等不及子进程了,除非我使用 0 而不是 WNOHANG|WUNTRACED

status = 0; 
pid_t child, endID;

if(amp == 1)
signal( SIGCHLD, SIG_IGN );

child = fork();

if (child < 0) {
perror("fork() error\n");
exit(EXIT_FAILURE);

} else if (child == 0) {
// do sth here
perror("error\n");

} else {
//sleep(1)

如果我删除 sleep,那么 parent 会首先执行……为什么?

最佳答案

这是一个开始(但请阅读下文):

static void
child_handler(int sig)
{
pid_t pid;
int status;

/* EEEEXTEERMINAAATE! */
while((pid = waitpid(-1, &status, WNOHANG)) > 0)
;
}

/* Establish handler. */
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = child_handler;

sigaction(SIGCHLD, &sa, NULL);

当然,这都是毫无意义的。如果父级简单地忽略 SIGCHLD,子级就会默默地收割而不会变成僵尸。

引用 TLPI :

Explicitly setting the disposition of SIGCHLD to SIG_IGN causes any child process that subsequently terminates to be immediately removed from the system instead of being converted into a zombie.

所以像这样的事情应该对你有用:

signal(SIGCHLD, SIG_IGN); /* Silently (and portably) reap children. */

关于c - 我该如何处理 SIGCHLD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7171722/

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