C - 标准输出打印顺序

C - Standard Output Printing Order

代码如下:

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 流的输出被缓冲。第一次调用 printfu 存储到缓冲区中,而第二行通过 write 系统调用将 m 直接输出到系统的标准输出文件句柄,最后第二次调用 printf 在缓冲区中存储 d 和一个换行符并将缓冲区刷新到系统标准输出句柄,因为输出是行缓冲的(如果 FILE* 与终端)和 \n 导致刷新或者因为流在程序正常终止时被刷新。

stderr 默认是无缓冲的,试试这个:

fprintf(stderr, "u");
write(STDERR_FILENO, "m", 1);
fprintf(stderr, "d\n");