2

例如puts()调用系统调用write()。这是否意味着它write()每次调用时都会调用puts(),还是在调用之前将 puts 累积到某个缓冲区中write()

4

2 回答 2

3

stdio 函数确实利用了缓冲。在特定情况下puts(),它总是将完整的行写入stdout,如果stdout连接到终端,则通常会被行缓冲,因此每次调用puts()都会导致调用write()

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

于 2013-03-02T04:07:14.293 回答
2

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

于 2013-03-02T03:54:44.413 回答