C 中的 fork() 和 wait()

fork() and wait() in C

我正在尝试学习 fork() 和 wait() 系统调用。如果我 运行 此代码:

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


int main (){

printf("Hi, I am the parent with pid %d \n ",getpid());

int rc = fork();

printf("Fork returned :   %d \n ",rc);

printf("I am the process with pid %d \n ",getpid());

wait(NULL);
return 0;
}

我在终端上得到了预期的输出:

Hi, I am the parent with pid 3639 
 Fork returned :   3640 
 I am the process with pid 3639 
 Fork returned :   0 
 I am the process with pid 3640 

但是,如果我删除 wait(NULL),我会在终端上得到一个奇怪的输出:

    Hi, I am the parent with pid 3715 
     Fork returned :   3716 
     I am the process with pid 3715 
     John@John-VirtualBox:~/Fork5$  Fork returned :   0 
     I am the process with pid 3716 

我完全理解,我们使用 wait() 使父进程等待子进程结束执行,以便我们可以将其从进程 table 中删除并释放其 PID。但是在这里,如果我删除 wait ,我们会看到终端被再次调用:

         John@John-VirtualBox:~/Fork5$  Fork returned :   0 
         I am the process with pid 3716  

甚至 return 也没有再回来。我不明白这与 wait 的功能有什么关系?或者换句话说,为什么 wait 会解决这个问题?

事件的顺序似乎是:

  1. shell是你程序的parent进程。当它 fork 是您的程序时,您的程序会继承标准流(到终端)。

  2. 您的程序fork是一个child进程,继承标准流(到终端)。

  3. 当您的 parent 进程终止时,shell 通知(因为它正在 waiting)并向终端发出提示。

  4. 但是,您的程序的 child 尚未终止,因此在 shell 发出提示后 child 打印其输出(然后终止)。

您会注意到 shell 不会 在 child 终止后发出第二个提示。 (shell 对您的 child 过程一无所知。)

输出顺序

你得到完整输出行(而不是任何交错的)的事实是因为所有进程的标准流都是面向行模式。

但是,无法保证进程之间的顺序。 OS 调度程序可以按它想要的任何方式对它们进行排序。您的 child 可以在 parent.

之前打印

:O)