关于 wait() 和 waitpid()

Mr.*_*vin 5 c wait waitpid

所以我在 C 上写了这段代码。我创建了一个父亲,它有两个子进程,其中一个变成了僵尸进程。一秒钟后它退出了,正在等他的父亲结束了。另一个子进程保持孤立状态,然后结束。我的问题是,如果我更改waitfor会发生什么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;
}
Run Code Online (Sandbox Code Playgroud)

Aya*_*973 4

引用wait/waitpid

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

  • 支持作业控制

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

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

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

因此 waitpid() 的行为取决于它的参数。