linux fork - execl,执行的进程变成了僵尸

Boz*_*zho 5 c++ linux fork zombie-process

我正试图从子进程运行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;
}
Run Code Online (Sandbox Code Playgroud)

但闪烁变成僵尸:

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>
Run Code Online (Sandbox Code Playgroud)

我试着设置信号(SIGCHLD,SIG_IGN); 但没有成功.实际上我认为儿童过程在闪烁结束之前就已经死了.

从命令行运行闪烁如:

twinkle --immediate --call 100
Run Code Online (Sandbox Code Playgroud)

不会使僵尸 - 闪烁正确关闭.那里我想念的是什么?

hmj*_*mjd 7

父进程需要waitpid()使用子进程id 调用.从链接的参考页面:

所有这些系统调用都用于等待调用进程的子进程中的状态更改,并获取有关状态已更改的子进程的信息.国家变更被认为是:儿童被终止; 孩子被一个信号拦住了; 或者孩子被信号恢复了.在终止孩子的情况下,执行等待允许系统释放与孩子相关联的资源; 如果没有执行等待,则终止的孩子仍然处于"僵尸"状态(参见下面的注释).

例如:

pid_t pid = fork();
if (0 == pid)
{
    /* Child process. */
}
else
{
    /* Parent process, wait for child to complete. */
    int status;
    waitpid(pid, &status, 0);
}
Run Code Online (Sandbox Code Playgroud)