代码如下:
printf("u");
write(STDOUT_FILENO, "m", 1);
printf("d\n");
输出: 泥
有人能解释为什么输出是按照这个顺序打印的吗?
默认情况下,标准输出是按行缓冲的,这意味着printf("u")
只会将"u"
放入其缓冲区中,直到出现fflush
或换行符为止。要按顺序查看输出,请尝试以下操作:
printf("u");
fflush(stdout);
write(STDOUT_FILENO, "m", 1);
printf("d\n");
printf
将“u”存储在缓冲区中。 write
将数据写入底层文件描述符。下一个printf
将“d\n”放入缓冲区。在将来的某个时间点(程序退出时或者当您调用printf
足够多次以使缓冲区满),缓冲区将被写入底层文件描述符。
通过标准C流输出是有缓冲的。第一次调用printf
将u
存储到缓冲区中,而第二行通过write
系统调用直接向系统标准输出文件句柄输出m
,最后第二次调用printf
将d
和一个换行符存储在缓冲区中并将缓冲区刷新到系统标准输出句柄上,这可能是因为输出是行缓冲的(如果FILE*
与终端相关联,则通常是默认设置),并且\n
会导致刷新,或者是因为流在程序正常终止时被刷新。
stderr
默认情况下是无缓冲的,请尝试以下操作:
fprintf(stderr, "u");
write(STDERR_FILENO, "m", 1);
fprintf(stderr, "d\n");
stdin
和stdout
不能是完全缓冲的。如果它确实是交互设备,则可以是行缓冲或无缓冲的。如果不是,则可以是完全缓冲的(并且至少在类Unix系统上,可能会是完全缓冲的,正如@WilliamPursell所指出的那样)。 - Crowman