例如puts()
调用系统调用write()
。
这是否意味着每次调用write()
时调用puts()
,或者在调用write()
之前将积累放入某个缓冲区?
答案 0 :(得分:3)
stdio功能确实利用了缓冲。在puts()
的特定情况下,它总是将完整的一行写入stdout
,如果stdout
连接到终端,那么它通常会进行行缓冲,因此每次调用{ {1}}会调用puts()
。
但是,可以write()
完全缓冲 - 使用stdout
(只要在setvbuf()
上的任何其他操作之前完成),或者更常见的是通过运行将stdout
附加到管道或文件的程序。在这种情况下,每次调用stdout
都不一定会调用puts()
。
答案 1 :(得分:2)
你是对的 - 通常C FILE*
流确实有存储数据的缓冲区。仅当缓冲区已满或流已关闭或调用fflush
时,它们才会进行Unix I / O系统调用。您可以使用C标准函数setvbuf
控制流的缓冲。