5

我正在尝试从子进程运行闪烁命令行。例如像这样:

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

不会使僵尸 - 闪烁正确关闭。我在那里缺少什么?

4

2 回答 2

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);
}
于 2012-12-06T15:08:46.623 回答
4

是的,但我需要父母和孩子异步工作。

其实我发现了我的错误。所以,如果有人有类似的问题,使用这样的信号处理函数:

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 Here: 是一个很好的解释。

于 2012-12-07T10:30:42.593 回答