Statement before fork() printing twice [duplicate]

a 夏天 提交于 2019-11-27 18:32:17

问题


This question already has an answer here:

  • printf anomaly after “fork()” 3 answers

I was experimenting with fork() and re-direction to check whether the re-directions done in the parent apply to the child too. I wrote the following simple program

#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;
}

The output ( error.txt ) I got is

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

Surprisingly, ERROR! WHY DONT U UNDERSTAND? is printing twice even though it appears much before the fork() is called and should only be printed once by the parent.

Can anyone shed some light on this?


回答1:


Since after reopen the stream is non-interactive, it's fully buffered and doesn't flush on '\n'. Before fork is called the buffer still contains the message, and after fork this buffered message was duplicated (because both processes got their own copies of stdout) and then flushed by both the parent and the child. See part 7.19.3 of C standard.

You can avoid such behavior by calling fflush just before fork.




回答2:


It's because of buffering. Do a fflush right after printf.

Both processes end up with the same copy of stdio's internal stuff and both proceed to flush it at exit. You might also prevent it from happening if you call _exit in the child.




回答3:


flushing the buffer will solve the problem. use fflush just after the print statement.




回答4:


It seems that the ERROR! WHY DONT U UNDERSTAND is still buffered after forking and gets written by both processes.

If you add

fflush(stdout);

right after your first printf() the internal buffer is flushed and it only appears once in your file.



来源:https://stackoverflow.com/questions/10700192/statement-before-fork-printing-twice

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!