【问题标题】:About wait() and waitpid()关于wait()和waitpid()
【发布时间】:2017-02-22 05:18:39
【问题描述】:

所以我在 C 上编写了这段代码。我创建了一个父进程,它有两个子进程,一个成为僵尸进程。一秒钟后它退出,等待他的父亲结束了。另一个子进程仍然是孤立的,然后结束。我的问题是,如果我将wait 更改为waitpid 会发生什么。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid;
    int status, value;

    pid = fork();

    if (pid > 0) { // Father

        pid = fork();

        if (pid > 0) { // Father
            wait(&status);
            value = WEXITSTATUS(status);

            if (value == 2)
                printf("Child 2");
            else if (value == 3)
                printf("Child 1");

        } else if (pid == 0) { //Child 2 - Orphan
            sleep(4);
            exit(2);

        } else {
            exit(1);
        }

    } else if (pid == 0) { // Child 1 - Zombie
        sleep(1);
        exit(3);

    } else {
        printf("Error al ejecutar el fork");
        exit(1);
    }



    return 0;
}

【问题讨论】:

  • 第一个孩子会变成僵尸,直到父亲退出,然后它会变成孤儿。
  • @Barmar 但怎么可能呢?第一个孩子(变成僵尸)也退出。
  • 如果一个进程的父进程没有等待它就退出了,它就会成为一个孤儿。即使孩子已经退出也是如此。当它成为孤儿时,init 采用它,等待它,然后进程消失。
  • @Barmar 那么,两个子进程都变成孤儿了?
  • 没有。你用waitpid() 等待的进程不会成为孤儿,因为你在等待它。

标签: c wait waitpid


【解决方案1】:

引用wait/waitpid

提供waitpid()函数有三个原因:

  • 支持作业控制

  • 允许 wait() 函数的非阻塞版本

  • 允许库例程(例如 system() 或 pclose())等待其子进程,而不会干扰进程尚未等待的其他已终止子进程

如果 pid 参数为 (pid_t)-1 且 options 参数为 0,则 waitpid() 函数应等效于 wait()。否则,其行为应由 pid 和 options 参数的值修改。

所以 waitpid() 的行为取决于它的参数。

【讨论】:

  • 我猜他的意思是waitpid(pid, &amp;status);
  • @Ayak973 什么是 wait() 函数的非阻塞版本
  • @Mr.Kevin 如果您使用WNOHANG 选项调用waitpid,它不会阻塞。
  • @Barmar:如果他按照您的建议编写代码,则代码无法编译(waitpid() 需要三个参数)。
  • 是的,我用缩写来表明我的意思,他正在等待一个特定的 pid
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多