当linux中的硬盘满时,fwrite不返回0为什么?

时间:2013-05-12 14:18:34

标签: c linux memory memory-management fwrite

当硬盘100%满时,fwrite(比如说1000字节)返回0 [失败,如预期] 但是当硬盘的空闲空间很小时说600Bytes,那么fwrite(1000字节)就不行了 返回0 [失败]但返回说300字节,再次调用fwrite仍然返回300bytes,fwrite永远不会失败,即使我们调用100次?

错误号没有正确设置为28.我的问题是为什么fwrite的行为?这是正确的吗?如果fwrite返回少于我们要写的字节,那么这意味着磁盘已满?

是否有建议处理这种情况?

2 个答案:

答案 0 :(得分:3)

来自fwrite man page

  

成功时,fread()fwrite()会返回读取或写入的项目数。此数字等于仅在大小为1时传输的字节数。如果发生错误或达到文件末尾,则返回值为短项目计数(或零)。

因此,短写操作表示存在错误,应查询errno以查看写操作未完成的原因。在咨询errno之后,Mat的回答解释了(并且C标准基本相同,除了它使用术语 indeterminate ),错误后文件位置无效,所以尝试在故障定义不明确之后继续使用它。

答案 1 :(得分:1)

POSIX说这是关于fwrite

  

如果发生错误,则未指定流的文件位置指示符的结果值。

这意味着在同一个流上重复相同的fwrite是代码中的错误 - 您不知道流的位置,因此尝试写入它根本不是一个好主意。

您处理此问题似乎已经在进行:在短errno之后检查fwrite并执行适合您的应用的任何内容。