这是我的一个非常基本的问题。在我教授的演讲幻灯片中,有一个我真的不会得到的例子。
她写道:
printf("u");
write(STDOUT_FILENO, "m", 1);
printf("d\n");
......她说这段代码的输出将是:
泥
我不明白。所以如果有人理解为什么会这样,请向我解释。
参考这个问题:
http://lagoon.cs.umd.edu/216/Lectures/lect17.pdf
(在最后一张幻灯片页面。)
答案 0 :(得分:21)
write
是一个系统调用 - 它由用户模式(如你的程序运行)和操作系统内核(当字节写入文件时处理实际写入磁盘)之间的接口实现)。
printf
是一个C标准库函数 - 它由加载到用户模式程序中的库代码实现。
C标准库输出函数默认缓冲其输出,直到达到行尾。当缓冲区已满或使用换行符终止时,它将通过从库实现中调用write
写入文件。
因此,通过printf
的输出不会立即发送到操作系统write
。在您的示例中,缓冲字母'u',然后立即写入字母'm',然后将“d \ n”附加到缓冲区,标准库将调用write(STDOUT_FILENO, "ud\n");
答案 1 :(得分:10)
默认情况下,stdout
行缓冲;在遇到换行符之前(或直到缓冲区填满),它才会刷新到输出。
所以"u"
位于缓冲区中,直到收到"d\n"
为止。但是write
绕过了这个缓冲区。