这会生成hello
的16个副本吗?如果没有,有多少?
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("hellon");
fork();
fork();
fork();
fork();
return(0);
}
这取决于是否将输出发送到文件或通过管道将其发送到程序(如cat
(或wc -l
((,或者是否将其留给写入终端。如果它到达终端,你应该只打印一行;如果它进入管道或文件,你会得到16。
另见fork()
之后的printf()
异常。
不同之处在于,当输出到达终端时,它是行缓冲的;当它进入"非交互式设备"(文件、管道(时,它被完全缓冲。
-
当输出为行缓冲时,格式中的换行符会强制输出在执行任何
fork()
调用之前出现。没有任何可供打印的进程。 -
当输出被完全缓冲时,
printf()
不会强制将缓冲的数据输出。从4个连续的fork()
调用创建的16个进程中,每个进程都有一个相同缓冲区的副本,等待刷新。当进程退出时,这些缓冲区会被刷新,因此会出现输出的16个副本。
有关标准规范,请参见C11§7.21.3文件¶3和¶7。
因为fork();
是在print语句之后调用的。只有一份《你好》。输出为:
你好