c - 为什么这个带 fork 的程序会打印两次?

标签 c fork

<分区>

根据我对fork()的理解,这应该打印“Hello, World!”一次,因为在调用 fork 之前只有一个进程。但是,它会打印两次。奇怪的是,如果我向字符串添加 \n 或使用 puts() 而不是 printf(),它只会打印一次。

#include<unistd.h>
#include<stdio.h>

int main() {
    printf("Hello, World!");
    fork();
}

最佳答案

缓冲。

由于默认情况下系统上的标准输出是缓冲的,因此不会立即打印。然而,缓冲区将在进程退出之前被刷新。

由于 fork 复制了父级的整个内存空间、文件描述符状态等,它还会复制需要打印的缓冲数据。

因此,除非您在 fork 之前显式刷新标准输出缓冲区(通过将 \n 附加到输出或调用 fflush(stdout);),否则两个进程都会有缓冲输出打印。

关于c - 为什么这个带 fork 的程序会打印两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42690197/

相关文章:

c - 在 C 中,对指针使用 typedef 是一种好形式吗?

c++ - 在socket编程的select()中重新启动定时器

c - SDCC 和 malloc() - 分配比可用内存少得多的内存

将指针数组值复制到 C 中另一个数组的末尾

c - 子进程出错并等待 `C`

c - 您认为当子进程执行 chdir 时会发生什么 - 这会影响父进程吗?

c - 在 Windows (ANSI C) (_beginthread/_beginthreadex/CreateProcess) 上 fork() 的任何简单/快速方法

c - C 叉练习

c++ - GDB Windows ??在回溯中

ruby - 收集 Ruby Parallel Gem 的结果