首页 文章

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

提问于
浏览
2

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

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

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

2 回答

  • 3

    POSIX说这关于fwrite

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

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

    你似乎已经在处理这个问题:在短暂的 fwrite 之后检查 errno 并做适合你的应用程序的任何事情 .

  • 1

    来自fwrite man page

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

    因此,短写操作是错误的指示,应查阅 errno 以查看写操作未完成的原因 . 在咨询了 errno 之后,Mat的回答解释了(并且C标准基本上说的是相同的东西,除了它使用术语不确定),错误后文件位置无效,因此在失败后尝试继续使用它没有明确定义 .

相关问题