This question already has answers here:
Closed 4 years ago.
printf anomaly after “fork()”
(3个答案)
我在用fork()编写一个多进程程序时遇到了一个问题。
下面是再现问题的示例代码(无需任何错误检查):
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

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

此代码打印两个“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显示。
有谁能对这个问题提供更好的解释吗?或者更好的是,如果我错了或者遗漏了什么,纠正我。

最佳答案

默认情况下,文件句柄stdout(由printf使用)是行缓冲的,这意味着当有换行符或缓冲区已满时,使用printf的输出将被刷新(并显示在控制台中)。
当fork创建父进程的精确副本时,两个进程在(未刷新的)输出缓冲区中具有相同的内容,当两个进程退出时,这两个进程都将被刷新。
所以你的猜测是对的。

关于c - fork()之前的Printf被打印两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29085193/

10-11 22:53
查看更多