【问题标题】:Concepts on fork() system callfork() 系统调用的概念
【发布时间】:2016-12-14 23:52:06
【问题描述】:

如果对 fork() 的调用成功执行,Unix 将 制作两份相同的地址空间副本,一份给父母,一份给孩子。 两个进程都将在 fork() 调用之后的下一条语句开始执行。[Ref:http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html]

所以,如果我执行以下代码:

#include <stdio.h>
int main(void)
{
    printf("Hello\n");
    fork();
    printf("World\n");
    return 0;
}

我认为它会打印出来

Hello
World
World

但是当我运行程序时它会打印出来

Hello
World
Hello
World

请解释我在哪里缺乏概念?

【问题讨论】:

标签: unix operating-system printf fork


【解决方案1】:

这是关于缓冲的。当您打印“hello”时,它不会立即输出。相反,它进入缓冲区。在分叉期间它仍然存在,因此,当每个任务终止并刷新其缓冲区时,有两个副本要发送到输出。

为了解决这个问题,您可以指定无缓冲 I/O 或在 fork 之前调用 fflush 以刷新缓冲区。

【讨论】:

  • @Gilles 删除了我提到的使用终端输入刷新终端输出。我觉得还是值得一提的。 fflush 当然也可以。它只是更漂亮。
  • 我看不出是什么让它“更高级”。 fflush 的优点是更简单且始终有效。只有在读取终端输入时才能使用终端输入,但通常情况并非如此。
  • @Gilles,我的想法是 OP 是初学者,所以不熟悉广泛的系统调用。我想以简单的方式回答,以便他无需深入研究新文档即可获得想法。终端 I/O 是大多数人开始的地方。
猜你喜欢
  • 2017-01-23
  • 2018-05-06
  • 2011-06-07
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2011-06-10
相关资源
最近更新 更多