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

Printf before fork() is being printed twice

我在使用 fork() 编写多进程程序时遇到了问题。

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

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

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

此代码打印 2 个 "hello world" 语句(一个来自父项,另一个来自子项)。然而,这不应该是这种情况,因为 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 显示。

谁能对这个问题提供更好的解释?或者更好的是,如果我错了或遗漏了什么,请纠正我。

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

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

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