问题
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