[英]linux fork - execl, the executed process becomes zombie
我正试图从子进程运行twinkle命令行。 例如这样:
int hangup() {
write_on_display("line3", " ");
write_on_display("hide_icon", "DIALTONE");
write_on_display("hide_icon", "BACKLIGHT");
int pid = fork();
if (pid == 0) {
int res = execl("/usr/bin/twinkle", " ", "--immediate", "--cmd",
"answerbye", (char *) NULL);
_exit(0);
} else {
perror("hangup");
return 0;
}
return 1;
}
但闪烁变成僵尸:
10020 pts/1 Z+ 0:00 [twinkle] <defunct>
10040 pts/1 Z+ 0:00 [twinkle] <defunct>
10053 pts/1 Z+ 0:00 [twinkle] <defunct>
10064 pts/1 Z+ 0:00 [twinkle] <defunct>
10097 pts/1 Z+ 0:00 [twinkle] <defunct>
10108 pts/1 Z+ 0:00 [twinkle] <defunct>
10130 pts/1 Z+ 0:00 [twinkle] <defunct>
我试着设置信号(SIGCHLD,SIG_IGN); 但没有成功。 实际上我认为儿童过程在闪烁结束之前就已经死了。
从命令行运行闪烁如:
twinkle --immediate --call 100
不会使僵尸 - 闪烁正确关闭。 那里我想念的是什么?
父进程需要调用具有子进程ID的waitpid()
。 从链接的参考页面:
所有这些系统调用都用于等待调用进程的子进程中的状态更改,并获取有关状态已更改的子进程的信息。 国家变更被认为是:儿童被终止; 孩子被一个信号拦住了; 或者孩子被信号恢复了。 在终止孩子的情况下,执行等待允许系统释放与孩子相关联的资源; 如果没有执行等待,则终止的孩子仍然处于“僵尸”状态 (参见下面的注释)。
例如:
pid_t pid = fork();
if (0 == pid)
{
/* Child process. */
}
else
{
/* Parent process, wait for child to complete. */
int status;
waitpid(pid, &status, 0);
}
是的,但我需要父母和孩子进行异步工作。
其实我发现了自己的错误。 所以,如果有人有类似的问题,使用这样的信号处理函数:
void catch_child(int sig_num)
{
/* when we get here, we know there's a zombie child waiting */
int child_status;
wait(&child_status);
}
和信号(SIGCHLD,catch_child)
在main()函数中一切正常。
PP这里: 是一个非常好的解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.