fork()打印前的语句两次
我正在尝试使用fork()
并重新定向以检查父项中的重定向是否也适用于孩子。 我写了以下简单的程序
#include #include #include 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()
之前出现很多并且只应由父级打印一次,也会打印两次。
任何人都可以对此有所了解吗?
由于reopen
后,流是非交互式的,因此它是完全缓冲的,并且不会在'\n'
上刷新。 在调用fork
之前,缓冲区仍然包含消息,并且在fork
之后,这个缓冲的消息被复制(因为两个进程都有自己的stdout
副本)然后由父节点和子节点刷新。 参见C标准的7.19.3部分。
你可以通过在fork
之前调用fflush
来避免这种行为。
这是因为缓冲。 在printf
之后立即进行fflush
。
这两个进程最终都得到了stdio
内部资料的相同副本,并且都在exit
继续刷新它。 如果在孩子中调用_exit
,也可以防止它发生。
刷新缓冲区将解决问题。 在print语句之后使用fflush。
好像ERROR! WHY DONT U UNDERSTAND
ERROR! WHY DONT U UNDERSTAND
仍然在分叉后缓冲并由两个过程写入。
如果你添加
fflush(stdout);
在你的第一个printf()
,内部缓冲区被刷新,它只在你的文件中出现一次。