fork()之前的Printf被打印两次

时间:2015-03-16 19:19:43

标签: c printf multiprocessing fork

我正在使用fork()编写一个多进程程序,我碰到了一个问题。

下面是一个重现问题的示例代码(没有任何错误检查):

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
  printf("hello world");
  fork();
}

此代码打印2&#34; hello world&#34;陈述(一个来自父母,另一个来自孩子)。但是,这不应该是这种情况,因为printf函数调用在fork()系统调用之前。 经过测试,问题似乎通过以下方式解决:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
  printf("hello world\n"); \\ addition of the new line character 
  // or by using fflush(stdout); 
  fork();
}

我的猜测是printf缓冲区在未刷新时被复制,因此子进程在退出之前清空其缓冲区的副本。因此,其他printf显示。

有人能提供更好的解释吗?或者甚至更好,如果我错了或错过了什么,请纠正我。

1 个答案:

答案 0 :(得分:2)

文件句柄stdout(由printf使用)默认为行缓冲,这意味着将使用printf刷新输出(并显示在控制台中)当有换行符或缓冲区已满时。

fork创建父进程的精确副本时,两个进程在(未刷新的)输出缓冲区中具有相同的内容,并且当两个进程退出时都将刷新它们。

所以是的,你的猜测是正确的。