在与其他Linux发行版的比较中,fork()在Ubuntu上的工作方式是否有所不同?

Sou*_*osh 3 c unix linux ubuntu gcc

好的,这是我在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());
}
Run Code Online (Sandbox Code Playgroud)

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

所以是的,我执行了两次确认.但后来我注意到在线GCC编译器和我大学校园里的RedHat,输出结果非常不同:

其他gcc输出

现在据我所知,fork()创建了调用它的进程的另一个实例.但是在Ubuntu中,它似乎是从代码中引入它的位置复制的,而不是整个Process.为了检测它,我稍微查了一下代码:

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

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

更改输出后

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

眠りネ*_*ネロク 9

但后来我注意到在线GCC编译器和我校区的RedHat,输出结果非常不同.

它与用户空间缓冲区的printf()使用有关.

如果程序在终端执行并且输出未重定向到文件,则通过printf()ing 刷新缓冲区\n.

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

  • 这是有道理的. (2认同)