【问题标题】:How do I interpret "waitpid function doesn't wait for the child that terminates first;"?如何解释“waitpid 函数不等待首先终止的孩子;”?
【发布时间】:2020-03-29 00:20:46
【问题描述】:

在“Unix 环境中的高级编程”一书中,wait and waitpid 部分说:

waitpid 函数不会等待首先终止的子进程;它有许多选项来控制它等待哪个进程。

我读这个好像子进程先退出,父进程没有调用waitpid函数,子进程不会被等待,退出后会保持僵尸进程。

所以我写了一些代码来测试:

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // child process
        printf("Child Process ID: %d \n", getpid());
        printf("Child Process Quit\n");
        exit(0);
    } else {
        // parent 
        sleep(5);
        printf("Parent Process ID: %d \n", getpid());
        printf("Wait child %d ...\n", pid);
        int status;
        waitpid(pid, &status, 0);
        printf("waitpid called\n");
        sleep(5);
    }
    return 0;
}

程序先打印出“子进程ID”和“子进程退出”,而父进程还在休眠,在另一个终端窗口,如果我使用ps -el | grep 'Z',我可以看到这个子进程是@ 987654325@(僵尸)。

然后5秒后,只要父进程调用waitpid,在另一个终端窗口中,使用ps -el | grep 'Z'就不会再显示僵尸子进程了,也就是说子进程已经等待了,没有不再是僵尸了。

看来父进程总是可以等待带有waitpid 的子进程,那么我该如何解释这个“waitpid 函数不等待首先终止的子进程”?

【问题讨论】:

    标签: unix


    【解决方案1】:

    如果您完成引文(现在在问题中完成),您会看到waitpid() 更灵活(比wait())。

    POSIX 规范说:

    pid 参数指定一组请求状态的子进程。 waitpid() 函数应该只返回这个集合中子进程的状态:

    • 如果pid 等于(pid_t)-1,则为任何子进程请求状态。在这方面,waitpid() 等效于 wait()。

    • 如果pid大于0,则指定请求状态的单个子进程的进程ID。

    • 如果 pid 为 0,则为进程组 ID 与调用进程 ID 相同的任何子进程请求状态。

    • 如果pid小于(pid_t)-1,则为进程组ID等于pid绝对值的任何子进程请求状态。

    因此,正如引用所说,waitpid() 并不总是(仅)等待第一个孩子死去;您可以更精确地选择您感兴趣的一个或多个孩子。此外,您还有WNOHANG 之类的选项,这意味着如果没有符合标准的孩子死亡(但至少有一个过程),则该函数返回符合标准)。如果没有符合条件的孩子,您将获得不同的状态。

    【讨论】:

    • 啊,我明白了,如果它实际上是“waitpid 函数不(仅)等待首先终止的孩子”,那么它就很有意义了。我对没有“仅”这个词的b / c感到困惑,它的含义完全不同。谢谢乔纳森!
    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多