【问题标题】:linux fork - execl, the executed process becomes zombielinux fork - execl,执行的进程变成僵尸
【发布时间】:2023-03-20 05:14:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ linux fork zombie-process


    【解决方案1】:

    父进程需要用子进程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);
    }
    

    【讨论】:

    • 旁注:IIRC,execl 之后的代码将不会执行,除非execl 产生错误。
    • @Jite,正确。如果execl() 成功,exit(0); 消失
    【解决方案2】:

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

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

    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 这里: is a very good explanation.

    【讨论】:

    • 在父进程中捕捉“子进程结束”信号是个好主意,并在那里为它发送wait。真的有用吗?
    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多