进程执行结束后fork()输出

Gre*_*lin 4 c fork

请考虑以下代码段:

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"?

Joh*_*uld 5

简短的回答是,您正在创建多个进程,这些进程相互异步运行.答案如下:

在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())