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() ,内部缓冲区被刷新,它只在你的文件中出现一次。