【发布时间】: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()。