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条评论
登录后参与评论

相关文章

来自分类Dev

当编译器将所有空格和注释从代码中删除时,GCC如何知道错误所在的行?

来自分类Dev

使用CMD中的GCC编译器编译目录中的所有.c文件

来自分类Dev

Sass编译器无法在Sublime Text 3中工作

来自分类Dev

填充如何在C编译器中工作

来自分类Dev

GCC编译器优化选项

来自分类Dev

-s选项如何在gcc编译器中实际工作?

来自分类Dev

gcc编译器__SIZE_TYPE__

来自分类Dev

表达式在单遍编译器中如何工作?

来自分类Dev

如何规避Anaconda GCC编译器?

来自分类Dev

OIS GCC编译器错误

来自分类Dev

Android的C编译器如何工作。

来自分类Dev

在SCO中安装GCC编译器

来自分类Dev

GCC编译器错误优化

来自分类Dev

如何在我的Linux Mint OS中添加新的gcc编译器

来自分类Dev

在gcc编译器之前构建binutils

来自分类Dev

Sass编译器无法在Sublime Text 3中工作

来自分类Dev

gcc中的编译器优化

来自分类Dev

如何找回默认的gcc编译器?

来自分类Dev

如何使GCC编译器正常工作?

来自分类Dev

float和double数据类型在gcc编译器中工作吗?

来自分类Dev

将gfortran与gcc编译器匹配

来自分类Dev

带有openCV的Intel编译器如何工作

来自分类Dev

如何使用gcc编译器tricore v3.4.6在C中printf sint32?

来自分类Dev

我可以在Visual Studio 2019和gfortran(gcc)编译器中工作吗?

来自分类Dev

如何手动将GCC设置为QtCreator中的编译器?

来自分类Dev

ubuntu 中的 gcc 编译器

来自分类Dev

如何为较新的 gcc 编译器安装 mpich?

来自分类Dev

如何使用 gcc 编译器 __attributes__ 在 ELF 部分中收集结构?

来自分类Dev

如何强制 gcc 编译器/链接器从可执行文件中删除未使用的静态数组

Related 相关文章

热门标签

归档