fwrite是非阻塞的吗?

时间:2010-03-22 15:44:30

标签: c file-io

在致电fflush之前,我可以将fwrite视为=非阻塞写入吗? 如果没有,为什么不,我的替代方案是什么?

3 个答案:

答案 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.