fork()在gcc编译器中如何工作?

巴拉特

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

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

main ( )
{
    fork () ;
    printf ( "\nHello" ) ;
    fork () ;
    printf ( "\nWorld" ) ;
}

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

Hello Hello World World World World 

不应该是:

Hello Hello World World Hello Hello World World

由于以下原因:

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'

我认为这是该程序可以工作的方式。您能解释我哪里出问题了吗?这就是为什么我想了解该功能的工作原理。

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

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

我无法弄清楚它是如何产生特定输出的。因此,我想了解一下,用简单的步骤调用fork()期间会发生什么?

制表符

所以:

  1. 除了第一件事肯定是“ Hello”而最后一件事肯定是“ World”之外,没有任何可靠的保证会以什么顺序发生(一切都取决于调度程序)。
  2. 到“ Hello”行时,该程序将有两个副本(一个分支加上原始副本),因此“ Hello”将打印两次。这些副本中的每一个都派生出另一个副本,因此,当您到达“世界”时,有四份副本,因此“世界”将打印四次。
  3. 当fork()一个副本时,它就从那里开始它不是从头开始的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章