根据我对fork()
的理解,这应该打印出“Hello,World!”一次,因为在调用fork
之前只有一个进程。但是,它会打印两次。奇怪的是,如果我在字符串中添加\n
或使用puts()
而不是printf()
,则只打印一次。
#include<unistd.h>
#include<stdio.h>
int main() {
printf("Hello, World!");
fork();
}
答案 0 :(得分:4)
缓冲
由于默认情况下系统上的标准输出是缓冲的,因此不会立即打印。但是,在退出进程之前,将刷新缓冲区。
由于fork
复制父项的整个内存空间,文件描述符状态等,它还会复制需要打印的缓冲数据。
因此,除非在分叉之前显式刷新标准输出缓冲区(通过将\n
附加到输出或调用fflush(stdout);
),否则两个进程都将具有缓冲输出以进行打印。
答案 1 :(得分:2)
我可以提供的解释:
printf("Hello, World!");
不会立即打印,因为输出未刷新为stdout
。
当fork()
复制进程内存时,它复制内部缓冲区,当两个进程都终止时,两个进程刷新缓冲区并输出文本两次。
答案 2 :(得分:2)
输出到stdout
(printf
写入输出的位置)默认行缓冲。这意味着当您打印换行符(或缓冲区已满)时,它的缓冲区将被刷新(并实际写入输出)。
如果不打印换行符,则子进程将复制缓冲的输出,并且当进程结束时,父进程和子进程都将刷新自己的缓冲区,从而导致打印两个输出。 / p>