fork()打印前的语句两次

时间:2012-05-22 10:27:04

标签: c fork stdout buffering io-redirection

我正在尝试使用fork()并重新指示检查父母的重新指示是否也适用于孩子。我写了以下简单程序

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main ()
{
    freopen( "error.txt", "w+t", stdout ); // From now on, stdout = error.txt
    printf (" ERROR!  WHY DONT U UNDERSTAND?\n");
    if ( fork() == 0 ) 
    {   
        printf(" I AM CHILD\n");
        exit(0);
    }   
    else-
    {   
        printf (" EITHER I AM A PARENT OR SOMETHING GOT SCREWED\n");
    }   


    return 0;
}

我得到的输出(error.txt)是

ERROR!  WHY DONT U UNDERSTAND?
EITHER I AM A PARENT OR SOMETHING GOT SCREWED
ERROR!  WHY DONT U UNDERSTAND?
I AM CHILD

令人惊讶的是,ERROR! WHY DONT U UNDERSTAND? 打印两次 ,即使它在调用fork()之前出现很多,并且只能由父母打印一次

任何人都可以对此有所了解吗?

4 个答案:

答案 0 :(得分:10)

由于在reopen之后流是非交互式的,因此它已完全缓冲并且不会在'\n'上刷新。在调用fork之前,缓冲区仍然包含消息,并且在fork之后这个缓冲的消息被复制(因为两个进程都有自己的stdout副本),然后由父进程刷新孩子见C标准第7.19.3部分。

您可以在fflush之前调用fork来避免此类行为。

答案 1 :(得分:3)

这是因为缓冲。在fflush之后立即printf

两个进程都以stdio内部资料的相同副本结束,并且都在exit继续刷新它。如果您在孩子中拨打_exit,也可能会阻止它发生。

答案 2 :(得分:1)

刷新缓冲区将解决问题。 在print语句之后使用fflush。

答案 3 :(得分:0)

似乎ERROR! WHY DONT U UNDERSTAND在分叉后仍然被缓冲,并由两个进程写入。

如果你添加

fflush(stdout);

在您的第一个printf()内部缓冲区被刷新后,它只在您的文件中出现一次。