请考虑以下代码段:
int main()
{
fork();
fork();
fork();
printf("Hello World\n");
}
Run Code Online (Sandbox Code Playgroud)
我得到了输出:[ubuntu 12.04]
aashish@aashish-laptop:~$ ./a.out
Hello World
Hello World
Hello World
aashish@aashish-laptop:~$ Hello World <---------------------------
Hello World
Hello World
Hello World
Hello World
Run Code Online (Sandbox Code Playgroud)
为什么在流程执行结束后输出"Hello Word"?
简短的回答是,您正在创建多个进程,这些进程相互异步运行.答案如下:
在shell提示符下键入./a.out时,会创建一个运行程序的进程.我们称之为过程1.
进程1调用fork().这将创建一个新的子进程,进程2,并且在第一次fork()调用之后,1和2都继续执行,继续执行第二次fork()调用.进程1创建子进程3,进程2创建子进程4.所有四个进程从第二个fork()之后继续进行到最后的fork()调用.流程1创建流程5; 流程2创建流程6; 流程3创建流程7; 和流程4创建流程8.

请注意,这些过程编号是任意的:不能保证按顺序创建它们.
一旦第一个fork()被执行,异步就会起作用.系统不保证关于孩子安排父母.从理论上讲,孩子可以在父母继续之前跑完,父母可以在孩子获得任何资源之前完成.最可能的情况是位于中间位置:原始进程与其后代共享资源,因此所有进程同时运行.
最后一块拼图是因为shell正在等待进程1完成.只有进程1. shell不知道(或关心)进程1是否已启动其他进程.因此,当Process 1完成时,shell会显示提示.事实上,进程1的一些后代还没有达到printf()语句.当他们到达那里时,shell已经显示了它的提示.
要进一步探讨这一点,您可能想尝试将fork()调用更改为printf("%d \n",fork()); 和/或将printf("Hello World \n")更改为printf("来自pid%d \n的Hello",getpid())