fwrite是非阻塞的吗?

在调用fflush之前我可以认为fwrite是=非阻塞写吗? 如果没有,为什么不,我的替代品是什么?

从技术上讲,fwrite()是一个阻塞调用,因为它在程序完成之前不会返回。 但是,fwrite()的完成定义是您提供的数据已写入内部文件缓冲区。 作为副作用,某些缓冲区也可能作为fwrite()调用的一部分写入磁盘,但您不能依赖该行为。 如果您绝对要求数据在磁盘上,则需要调用fflush()。

fwrite() 可能会阻塞。 它(通常)使用具有最大长度的内部缓冲区。 当缓冲区变满时,它将发送数据(全部或部分内部缓冲区)。

setbuf()setvbuf()函数允许您更改缓冲区的最大长度,并实际为缓冲区提供块,但细节是依赖于实现的,因此您必须阅读特定C库的文档。

从概念上讲,如果您希望在所有条件下都能保证无阻塞写入,那么您需要潜在的无限缓冲区,这可能有些昂贵。 您可以创建自己的函数来缓冲数据(在一块RAM中,使用realloc()使其在必要时增长)并在结尾处写出(使用fwrite()和可能的fflush() )。 或者,您可以尝试使用非阻塞I / O,其中写入函数永远不会阻塞,但可能会因为内部拥塞而拒绝接受您的数据。 非阻塞I / O不是C标准本身的一部分(没有f*()函数),但可以在某些系统上以各种名称找到(例如在Unix系统上使用fcntl()write() ) 。

fwrite()正在阻塞。 fwrite()可以随时在内部调用fflush()。

如果你需要它来缓冲,那么缓冲在你自己的数组中。 fwrite的缓冲区通常是几K.