【问题标题】:Does fork() work differently on Ubuntu in Comparison to other Linux Distribution?与其他 Linux 发行版相比,fork() 在 Ubuntu 上的工作方式是否不同?
【发布时间】:2018-07-21 17:21:00
【问题描述】:

好的,这是我在 Ubuntu 17.10 上使用的初始代码。

#include <unistd.h>
#include <stdio.h>
void main()
{
   printf("Demonstrating fork():\n");
   fork();
   printf("After fork():\nProcess Id is %d\n", getpid());
}

所以在这个阶段我发现输出是:

所以是的,我执行了两次以确认它。但后来我注意到在 Online GCC Compilers 和我大学校园的 RedHat 上,输出有很大不同:

现在据我所知,fork() 创建了另一个调用它的进程实例。但在 Ubuntu 中,它似乎是从代码中引入它的地方开始复制的,而不是整个过程。为了检测它,我将代码稍微更改为:

#include <unistd.h>
#include <stdio.h>
void main()
{
    fork();
    printf("Demonstrating fork():\n");
    printf("After fork():\nProcess Id is %d\n", getpid());
}

令我惊讶的是,我对输出的观察是正确的:

那么任何人都可以确认这一点,并解释为什么会发生这种情况,或者只是我系统上的一个错误?

【问题讨论】:

  • 一个问题。这是否发生在您发布的完全相同的代码上?
  • @IharobAlAsimi 正是我的观点,但这显示了截然不同的输出,我需要一个明确的答案,为什么会这样。我已经在我同学的 10 多个系统上复制了这个确切的代码,并且输出都符合预期,除了在 Ubuntu 上。我只有一台机器可以测试它。
  • 哦,启用编译器警告。 UB 可能是由您声明main() 的方式引起的。我不记得是不是UB,但是用符合标准的编译器写void main()肯定是错误的。
  • 是的,完全相同的代码。
  • @SoumyadeepGhosh 看来有人回答正确,但请不要再void main()

标签: c linux ubuntu unix gcc


【解决方案1】:

但后来我注意到在线 GCC 编译器和我大学校园的 RedHat 中,输出完全不同。

这与printf() 使用的用户空间缓冲区有关。

如果程序在终端执行并且输出没有重定向到文件,那么缓冲区会被printf()ing \n刷新。

在线版本不会通过printf()ing a \n 刷新缓冲区,因为它正在使用另一个刷新策略(例如:输出可能被重定向到文件)。

【讨论】:

  • 这是有道理的。
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 2019-05-07
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
相关资源
最近更新 更多