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
会解决这个问题?
事件的顺序似乎是:
shell是你程序的parent进程。当它 fork
是您的程序时,您的程序会继承标准流(到终端)。
您的程序fork
是一个child进程,也继承标准流(到终端)。
当您的 parent 进程终止时,shell 通知(因为它正在 wait
ing)并向终端发出提示。
但是,您的程序的 child 尚未终止,因此在 shell 发出提示后 child 打印其输出(然后终止)。
您会注意到 shell 不会 在 child 终止后发出第二个提示。 (shell 对您的 child 过程一无所知。)
输出顺序
你得到完整输出行(而不是任何交错的)的事实是因为所有进程的标准流都是面向行模式。
但是,无法保证进程之间的顺序。 OS 调度程序可以按它想要的任何方式对它们进行排序。您的 child 可以在 parent.
之前打印
:O)
我正在尝试学习 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
会解决这个问题?
事件的顺序似乎是:
shell是你程序的parent进程。当它
fork
是您的程序时,您的程序会继承标准流(到终端)。您的程序
fork
是一个child进程,也继承标准流(到终端)。当您的 parent 进程终止时,shell 通知(因为它正在
wait
ing)并向终端发出提示。但是,您的程序的 child 尚未终止,因此在 shell 发出提示后 child 打印其输出(然后终止)。
您会注意到 shell 不会 在 child 终止后发出第二个提示。 (shell 对您的 child 过程一无所知。)
输出顺序
你得到完整输出行(而不是任何交错的)的事实是因为所有进程的标准流都是面向行模式。
但是,无法保证进程之间的顺序。 OS 调度程序可以按它想要的任何方式对它们进行排序。您的 child 可以在 parent.
之前打印:O)