首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分支()在gcc编译器中是如何工作的?

分支()在gcc编译器中是如何工作的?
EN

Stack Overflow用户
提问于 2014-01-04 10:49:32
回答 3查看 3.2K关注 0票数 3

我有一个C程序,其中包含了fork()调用。

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h>

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

这是我对gcc的输出:

代码语言:javascript
复制
Hello Hello World World World World 

应该是:

代码语言:javascript
复制
Hello Hello World World Hello Hello World World

由于以下原因:

代码语言:javascript
复制
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()的第1行叉()调用创建的子进程的第二行,等等。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-04 10:53:33

所以:

  1. 除了第一件事肯定是"Hello“,最后一件事肯定是"World”之外,没有确切的保证会在哪一种顺序中发生(这一切都取决于调度程序)。
  2. 当您到达"Hello“行时,有两个程序副本正在运行(一个叉子加原件),因此"Hello”将打印两次。每一份都会分叉另一份,所以当你到达“世界”时,有四份,所以“世界”将打印四次。
  3. 当您使用fork()复制时,它就从那里开始;它不是从一开始就开始的。
票数 11
EN

Stack Overflow用户

发布于 2014-01-04 11:09:57

当您使用fork()子程序时,它直接从下一行代码开始,而不是从一开始就开始。

main():

代码语言:javascript
复制
Line1 Creates child one
Line2 prints "Hello"
Line3 Creates child two
Line4 prints "World" 

儿童一号:

代码语言:javascript
复制
Line2 prints "Hello"
Line3 Creates child three
Line4 prints "World"

儿童二:

代码语言:javascript
复制
Line4 prints "World"

儿童三:

代码语言:javascript
复制
Line4 prints "World"

因此,一个可能的答案是

代码语言:javascript
复制
Hello Hello World World World World 

分别从主、子一、子二、子三

然而,执行的顺序可能会改变(Race Condition)

票数 3
EN

Stack Overflow用户

发布于 2014-01-04 11:42:46

当进行分叉调用时,您无法确定哪个进程将首先进行。因此,无法真正找到输出的正确顺序。

唯一的保证是对所有进程(分叉子进程和父进程)都有一个执行。

现在,在第一个分叉之后,有两个进程,因此您可以确保至少会打印两个Hello和两个World。虽然,在打印两个Hello之后,还有另一个分叉。

现在,这个分叉将由两个进程执行,因此,您现在将对处于就绪状态的进程进行处理,并且在执行过程中,每个进程都将打印World。因此,在最后的输出中,您可以看到2 Hellofour World

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20919958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档