调用stdio函数每次都会导致系统调用吗?

时间:2013-03-02 03:44:14

标签: c linux

例如puts()调用系统调用write()。 这是否意味着每次调用write()时调用puts(),或者在调用write()之前将积累放入某个缓冲区?

2 个答案:

答案 0 :(得分:3)

stdio功能确实利用了缓冲。在puts()的特定情况下,它总是将完整的一行写入stdout,如果stdout连接到终端,那么它通常会进行行缓冲,因此每次调用{ {1}}会调用puts()

但是,可以write()完全缓冲 - 使用stdout(只要在setvbuf()上的任何其他操作之前完成),或者更常见的是通过运行将stdout附加到管道或文件的程序。在这种情况下,每次调用stdout都不一定会调用puts()

答案 1 :(得分:2)

你是对的 - 通常C FILE*流确实有存储数据的缓冲区。仅当缓冲区已满或流已关闭或调用fflush时,它们才会进行Unix I / O系统调用。您可以使用C标准函数setvbuf控制流的缓冲。