为什么要在setvbuf()
中留出一块内存?
我不知道您为什么要将读/写流发送到缓冲区。
答案 0 :(得分:5)
setvbuf
不旨在输出重定向到一个缓冲器(如果你想你使用sprintf
&安培一个缓冲器执行IO; CO。),但严格控制的缓冲行为给定流。
在事实,C IO的功能不立即传递到被写入到操作系统中的数据,但保持一个中间缓冲器,以避免连续进行(可能昂贵的)系统调用,实际执行之前等待缓冲器填充写。
在最简单的情况下是完全禁用缓冲(有用例如,如果写入一个日志文件,其中所需的数据去磁盘的每个输出操作之后立即),或者,在另一方面,为了使在流块缓冲默认情况下禁用它(或设置为行缓冲)。这可能有助于提高输出性能。
如果您正在使用已知可以与特定缓冲区大小一起使用的设备,那么为输出设置特定缓冲区会很有用;另一方面,您可能希望有一个小缓冲区来减少内存受限环境中的内存使用量,或者在断电时避免丢失大量数据而不会完全禁用缓冲。
答案 1 :(得分:1)
用例如打开的C文件默认情况下,fopen
是缓冲的。您可以使用setvbuf
提供自己的缓冲区,或者使文件操作完全无缓冲(比如stderr
)。
它可用于在没有该功能的系统上创建fmemopen
功能。
答案 2 :(得分:1)
文件缓冲区的大小会影响标准库调用I / O速率。 Steven的“UNIX环境中的高级编程”第5章中有一个表格,显示I / O吞吐量随着I / O缓冲区大小而急剧增加,最高可达~16K,然后平稳。许多其他因素会影响整体I / O吞吐量,因此这种“调整”影响可能会或可能不会解决问题。除了关闭/开启缓冲之外,这是“为什么”的主要原因。
答案 3 :(得分:0)
每个FILE
结构都有一个内部与之关联的缓冲区。这背后的原因是减少I / O,并且真正的I / O操作是耗时的。
所有读/写都将被缓冲,直到缓冲区已满。缓冲的所有数据将在一个实际I / O操作中输出/输入。
答案 4 :(得分:0)
为什么要在setvbuf()中留出一块内存?
用于缓冲。
我不知道您为什么要将读/写流发送到缓冲区。
我也不是,但因为这不是它的意义,这一点没有实际意义。
"The setvbuf() function may be used on any open stream to change its buffer" [我的重点]。换句话说,它已经有一个缓冲区,所有的功能都改变了它。它没有说'将你的读/写流发送到缓冲区'。我建议你阅读 man 页面,看看实际所说的内容。特别是这部分:
当输出流未缓冲时,一旦写入,信息就会出现在目标文件或终端上;当它被块缓冲时,许多字符被保存起来并写成块;当它是行缓冲时,字符被保存,直到输出换行符或从连接到终端设备的任何流中读取输入(通常是stdin)。