Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 与其他Linux发行版相比,fork()在Ubuntu上的工作方式是否有所不同?_C_Linux_Ubuntu_Unix_Gcc - Fatal编程技术网

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

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

好的,这是我在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”);
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似乎有人回答正确,但仍然请不要再这样做了。这是有道理的。