我仍然无法理解为什么fork使用以下两个代码提供不同的输出
#include<stdio.h>
void main()
{
printf("Hello World\n");
fork();
}
提供输出
Hello World
此代码的位置
#include<stdio.h>
void main()
{
printf("Hello World");
fork();
}
提供输出
Hello WorldHello World
第二种情况从其他问题中可以清楚地看出,两个进程都获得了相同缓冲区的副本。因此,在fork之后,两个进程最终都会刷新缓冲区并将内容分别打印到屏幕上。
但我不清楚为什么第一种情况如此。
答案 0 :(得分:2)
这是由于缓冲行为。
#include<stdio.h>
void main()
{
printf("Hello World\n");
fork();
}
在调用fork之前刷新输出,因此当它仍然只有一个进程时打印已经完成。
至于为什么printf("Hello World\n");
立即被刷新而printf("Hello World");
并非那么容易。这取决于实际情况。在你的情况下,你可能在命令行中运行它,其中行缓冲很常见,行缓冲意味着一旦你有换行符就会刷新它。如果你写入文件,它可能会在你得到任何输出之前缓冲更多,你也可能在第一种情况下看到2个输出。
如果您想要与刷新一致的行为,您可能希望自己动手。
答案 1 :(得分:2)
让我用简单的话来解释: 考虑一下这两个陈述:
printf(&#34; Hello World&#34;)
和
printf(&#34; Hello World \ n&#34;)
STDOUT 线路缓冲 printf 仅在缓冲区完整时执行或由终止时执行>新行字符
printf(&#34; Hello World&#34;)将无法保证显示输出,除非
缓冲区完整或以新行字符终止。因此,当调用 fork()时,
Fork会创建一个进程的副本,这意味着在 fork 之后,有两个相同的进程,
每个都有FILE副本* STDOUT 因此,每个进程都有相同的缓冲区内容 STDOUT
因为在你的第二个程序中没有换行符,
每个进程在其缓冲区中都有字符串。
然后每个进程打印另一个字符串,并且所有内容都被打印,因为它以新行字符终止。这就是为什么你看到两个相同的输出。
但是
在你的第一个程序中,有一个新行字符,它显示输出
语句执行后立即因此当调用fork()时刷新缓冲区内容
进程尝试访问缓冲区,但由于缓冲区为空,因此不会打印任何内容
因此,不同的响应是由于 stdout 的缓冲行为
希望它有所帮助!!