fwrite是非阻塞的吗?

Joh*_*els 6 c file-io

在打电话之前fflush我可以考虑fwrite=非阻塞写吗?如果没有,为什么不,我的替代品是什么?

Tho*_*nin 7

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

setbuf()setvbuf()功能让你改变缓冲区最大长度,实际提供的缓冲块,但细节实现依赖,所以你必须阅读您的特定C库的文档.

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


And*_*lly 6

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

  • 请注意,fflush 仅保证数据从用户态移至内核。内核还会进行缓冲,因此如果断电,您仍然可能会丢失数据。如果您确实希望将数据保存在磁盘上,则需要执行“fsync(fileno(fp));” (2认同)