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