fork()函数如何在gcc编译器中运行?

Bha*_*Yes 1 c gcc fork parent-child

我有一个带有fork()调用的C程序.

#include <stdio.h>
#include <unistd.h>

main ( )
{
    fork () ;
    printf ( "\nHello" ) ;
    fork () ;
    printf ( "\nWorld" ) ;
}
Run Code Online (Sandbox Code Playgroud)

这是我在gcc上得到的输出:

Hello Hello World World World World 
Run Code Online (Sandbox Code Playgroud)

不应该是:

Hello Hello World World Hello Hello World World
Run Code Online (Sandbox Code Playgroud)

由于以下原因:

Line1: First fork creates a child process.
1.2: Prints 'Hello'
1.3:Creates a child process because of 2nd fork in it.
1.3.2:Prints 'Hello' and 'World'.
1.4:Prints 'World'.
Line2: Prints 'Hello'.
Line3: Second fork() creates child process
3.1:creates a child process
3.2: Prints 'Hello'
3.4: Prints 'World'
Line 4: Prints 'World'
Run Code Online (Sandbox Code Playgroud)

这就是我认为这个程序可行的方式.你能解释我哪里出错了吗?这就是为什么我想了解该功能的工作原理.

注意:我检查了手册页,但我不太了解它.

数字也是主要功能的行号.例程:1.2对应于由main()的第1行fork()调用创建的子进程的第二行,依此类推.

我无法弄清楚它是如何产生特定输出的.所以我想明白,fork()中发生的事情是在简单的步骤中调用的吗?

tab*_*top 10

所以:

  1. 没有可靠保证订单会发生什么事情(一切都取决于调度程序),除了第一件事肯定是"你好",最后一件事肯定是"世界".
  2. 当你到达"Hello"行时,有两个程序副本(一个fork加原件),因此"Hello"将打印两次.这些副本中的每一个都会分发另一份副本,因此当您进入"世界"时,有四份副本,因此"世界"将打印四次.
  3. 当你fork()一个副本时,它就在那里开始; 它不是从一开始就开始的.

  • @BharathYes并回答添加的问题:一旦你分叉,你不再有一个线性路径,而是平行路径.原件和第一份副本都将打印"Hello"和"World"; 第二个和第三个副本将分别打印"世界" - 但这四个过程都是单独的过程,您无法控制它们中的任何一个将发生的顺序.在新的接管之前,它们也不能完成; 它们可以由操作系统自行决定切换和失控. (2认同)