C标准I / O与UNIX I / O基础

时间:2011-12-14 18:24:14

标签: c linux unix io buffer

这是我的一个非常基本的问题。在我教授的演讲幻灯片中,有一个我真的不会得到的例子。

她写道:

printf("u"); 
write(STDOUT_FILENO, "m", 1); 
printf("d\n");

......她说这段代码的输出将是:

  

我不明白。所以如果有人理解为什么会这样,请向我解释。

参考这个问题:

http://lagoon.cs.umd.edu/216/Lectures/lect17.pdf

(在最后一张幻灯片页面。)

2 个答案:

答案 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绕过了这个缓冲区。