在致电fflush
之前,我可以将fwrite
视为=非阻塞写入吗?
如果没有,为什么不,我的替代方案是什么?
答案 0 :(得分:7)
fwrite()
可能阻止。它(通常)使用具有最大长度的内部缓冲区。当缓冲区变满时,它将发送数据(全部或部分内部缓冲区)。
setbuf()
和setvbuf()
函数允许您更改缓冲区最大长度,并实际为缓冲区提供块,但细节依赖于实现,因此您必须阅读文档特定的C库。
从概念上讲,如果您希望在所有条件下都能保证无阻塞写入,那么您需要潜在的无限缓冲区,这可能有些昂贵。您可以创建自己的函数来缓冲数据(在一块RAM内,使用realloc()
使其在必要时增长),并在(仅使用fwrite()
和可能的fflush()
时写出)结束。或者,您可以尝试使用非阻塞I / O,其中写入函数永远不会阻塞,但可能会因为内部拥塞而拒绝接受您的数据。非阻塞I / O不是C标准本身的一部分(没有f*()
函数),但可以在某些系统上以各种名称找到(例如fcntl()
和{{1}在Unix系统上)。
答案 1 :(得分:4)
技术上fwrite()
是一个阻塞调用,因为它在程序完成之前不会返回。但是,fwrite()
的完成定义是您提供的数据已写入内部文件缓冲区。作为副作用,某些缓冲区也可能作为fwrite()
调用的一部分写入磁盘,但您不能依赖该行为。如果您绝对要求数据位于磁盘上,则需要调用fflush()
。
答案 2 :(得分:2)
fwrite()正在阻止。 fwrite()可以随时在内部调用fflush()。
如果你需要它来缓冲,那么在你自己的数组中缓冲。 fwrite的缓冲区通常是几K.