在C语言中,wait(NULL)的工作原理是什么?

12

如果我使用wait(null),并且我确定子进程在我们到达父进程中的wait(null)之前完成(退出),那么wait(null)会阻塞父进程吗?

我的意思是,wait()不会收到任何信号,对吧?

int main() {
    int pipe_descs[2];
    int i, n, p;

    srand(time(NULL(;
    pipe(pipe_descs);

    for (i = 0; i < 2; i++) {
        pid_t status = fork();

        if (status == 0) {
            n = rand() % 100;
            p = (int) getpid();

            write(pipe_descs[1], &n, sizeof(int));
            write(pipe_descs[1], &p, sizeof(int));
            exit(0);
        }
        else {
            read(pipe_descs[0],  &n,  sizeof(int));
            read(pipe_descs[0],  &p,  sizeof(int));
            printf(" %d %d\n", n, p);
            wait(NULL); // (1)
        }
    }
    return 0;
}

8
也许阅读一下手册页(man page)会有所帮助:如果子进程已经改变了状态,这些调用将立即返回。或者您可以尝试在这些条件下运行它,看看会发生什么? - kaylum
无论如何,我无法想到任何确保子进程在父进程等待它之前已终止的方法,除非父进程手动处理 SIGCHLD。特别地,在您的示例代码中,不能安全地假设总是会发生这种情况。 - John Bollinger
1
什么是 null - too honest for this site
1个回答

31

wait(NULL)会阻塞父进程,直到任何一个子进程结束。如果子进程在父进程调用wait(NULL)之前终止,则子进程将变为僵尸进程,直到其父进程等待并从内存中释放。

如果父进程不等待子进程并且先于子进程完成,则子进程成为孤儿进程,并被分配给init作为其子进程。然后,init会等待并释放进程表中的该进程条目。

换句话说:父进程将被阻塞,直到子进程返回一个退出状态给操作系统,然后将该状态传递给父进程。如果子进程在父进程到达wait(NULL)之前完成,则它将读取退出状态,释放进程表中的进程条目,并继续执行直到自己也结束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接