叉之前声明()打印两次[重复](Statement before fork() printing t

2019-06-24 15:55发布

这个问题已经在这里有一个答案:

  • 后的printf异常“叉()” 3个答案

我与实验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? ERROR! WHY DONT U UNDERSTAND? 正在打印的两倍 ,即使它大部分之前出现fork()被调用,并只能由父打印一次。

任何人都可以阐明这一些轻?

Answer 1:

由于后reopen流是非交互的,它的全缓冲和冲不'\n' 。 前fork被称为缓冲仍然包含消息,后fork被复制此缓冲的消息(因为这两个进程有自己的副本stdout ),然后由父母和孩子都脸红了。 见C标准的一部分7.19.3。

你可以通过调用避免这种行为fflush之前fork



Answer 2:

这是因为缓冲。 做一个fflush之后printf

这两个过程都结束了同一份stdio的内在的东西,都在继续刷新它exit 。 你也可以防止它,如果你调用发生_exit的孩子。



Answer 3:

刷新缓冲区就能解决问题。 使用fflush只是打印语句之后。



Answer 4:

看来, ERROR! WHY DONT U UNDERSTAND ERROR! WHY DONT U UNDERSTAND分叉后仍然缓冲并且得到由这两个进程写入。

如果添加

fflush(stdout);

你的第一个之后printf()内部缓冲器被刷新,而且只在您的文件中出现一次。



文章来源: Statement before fork() printing twice [duplicate]