理解为什么fork在C中给出不同的结果

时间:2015-05-10 02:19:52

标签: c linux output fork

虽然有一些类似的问题,例如thisthis

我仍然无法理解为什么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之后,两个进程最终都会刷新缓冲区并将内容分别打印到屏幕上。

但我不清楚为什么第一种情况如此。

2 个答案:

答案 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 缓冲行为

希望它有所帮助!!