gpt4 book ai didi

c - fork() 流程执行结束后的输出

转载 作者:太空狗 更新时间:2023-10-29 15:22:28 24 4
gpt4 key购买 nike

考虑以下代码片段:

int main()
{
fork();
fork();
fork();
printf("Hello World\n");
}

我得到输出:[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

为什么流程执行结束后输出“Hello Word”?

最佳答案

简短的回答是您正在创建多个进程,这些进程彼此异步运行。长答案如下:

当您在 shell 提示符下键入 ./a.out 时,会创建一个运行程序的进程。我们称该过程为 1。

进程 1 调用 fork()。这将创建一个新的子进程,进程 2,并且 1 和 2 在第一次 fork() 调用后继续执行,继续执行第二次 fork() 调用。进程 1 创建子进程 3,进程 2 创建子进程 4。所有四个进程在第二次 fork() 之后继续执行,进行到最终的 fork() 调用。进程1创建进程5;进程 2 创建进程 6;进程 3 创建进程 7;进程 4 创建进程 8。

non-artist's rendering of process hierarchy

请注意,这些进程编号是任意的:不能保证它们会按该顺序创建。

一旦第一个 fork() 被执行,异步就开始发挥作用。该系统不提供有关安排 parent 与 child 有关的保证。从理论上讲, child 可以在 parent 继续之前完成, parent 可以在 child 获得任何资源之前完成。最有可能的情况介于两者之间:原始进程与其后代共享资源,因此所有进程都同时运行。

拼图的最后一 block 是因为 shell 正在等待进程 1 完成。 进程 1。shell 不知道(或不关心)进程 1 已经启动了其他进程。因此,当进程 1 完成时,shell 会显示提示。碰巧的是,进程 1 的一些后代还没有到达 printf() 语句。当他们到达那里时,shell 已经显示了它的提示符。

要进一步探讨这一点,您可能想尝试将 fork() 调用更改为 printf( "%d\n", fork() ); 和/或将 printf("Hello World\n") 更改为 printf("Hello from pid %d\n", getpid() )

关于c - fork() 流程执行结束后的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11802055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com