C 与其他Linux发行版相比,fork()在Ubuntu上的工作方式是否有所不同?
好的,这是我在Ubuntu 17.10上使用的初始代码C 与其他Linux发行版相比,fork()在Ubuntu上的工作方式是否有所不同?,c,linux,ubuntu,unix,gcc,C,Linux,Ubuntu,Unix,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()); } #包括 #包括 void main() { printf(“演示fork():\n”); fo
#include <unistd.h>
#include <stdio.h>
void main()
{
printf("Demonstrating fork():\n");
fork();
printf("After fork():\nProcess Id is %d\n", getpid());
}
#包括
#包括
void main()
{
printf(“演示fork():\n”);
fork();
printf(“fork()之后:\n进程Id为%d\n”,getpid());
}
所以在这个阶段,我发现输出是:
所以是的,我执行了两次来确认。但后来我注意到,在我大学校园的在线GCC编译器和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());
}
#包括
#包括
void main()
{
fork();
printf(“演示fork():\n”);
printf(“fork()之后:\n进程Id为%d\n”,getpid());
}
令我惊讶的是,我的观察结果是正确的:
那么,有人能证实这一点,并向我解释为什么会发生这种情况,或者仅仅是我系统上的一个bug
但后来我注意到,在我大学校园的在线GCC编译器和RedHat上,输出是完全不同的
它与用户空间缓冲区printf()
使用有关
如果程序在终端执行,且输出未重定向到文件,则缓冲区将由printf()
ing\n
刷新
在线版本不会通过
printf()
调用\n
来刷新缓冲区,因为它正在使用另一个刷新策略(例如:输出可能被重定向到文件)。一个问题。这与你发布的代码完全相同吗?@IharobAlAsimi正是我的观点,但这显示出极为不同的输出,我需要一个明确的答案为什么会这样。我已经在我同学的10多个系统上复制了这段代码,输出结果都如预期的一样,除了Ubuntu。我只有一台机器可以测试它。哦,启用编译器警告。UB可能是由您声明main()
的方式引起的。我不记得它是否是UB,但用标准兼容编译器编写void main()
肯定是错误的。是的,那完全是相同的代码。@SoumyadeepGhosh似乎有人回答正确,但仍然请不要再这样做了。这是有道理的。