为什么当设备上没有剩余空间时,ferror()返回EPERM-我会期待ENOSPC

时间:2011-08-12 15:10:37

标签: c++ linux posix

我使用cstdio在linux上编写了一个C ++应用程序。它包含一个应该用随机数据覆盖整个设备的功能。它被赋予一个文件名,在内存中创建随机数据块,并使用fwrite()将它们一个接一个地写入文件。 如果设备已满,则应返回该功能。如果存在不同的写入错误,则应该抛出异常。 因此,当发生错误时,我会询问ferror()并想要识别这是否是“磁盘已满” - 一个不同的错误。 当磁盘已满时,我希望得到ENOSPC。但是函数写入磁盘,当它充满时,ferror()返回的值为1(即EPERM)。 另一方面,perror打印出正确的“设备上没有剩余空间”。 这是我的C ++库中的错误吗?或者是EPERM正确的错误代码? 如果是正确的错误代码,是否仅在磁盘已满时返回EPERM,因此适合识别此特定错误?

5 个答案:

答案 0 :(得分:2)

ferror仅告诉您流上是否有错误。要查看错误实际是什么,您必须检查errno

perror检查errno这就是打印正确错误消息的原因。

答案 1 :(得分:1)

ferror不应返回errno值;如果发生流错误,它只返回一个非零值。您应该直接检查errno

答案 2 :(得分:1)

ferror只是表示发生了错误,如果您测试了以前写入的函数的结果(或fclose的结果),您应该已经知道了。 POSIX强制要求那些函数(fwrite,fputc,fprintf,fclose)将errno设置为描述问题的值。

答案 3 :(得分:0)

  

这是我的C ++库中的错误

更有可能是内核或设备驱动程序中的错误。但两者都不可能。

答案 4 :(得分:0)

可能是因为在ext文件系统上,默认情况下它们中的一部分是为root保留的。因此,可能还有空间,但当前用户无法使用它。

man mke2fs

   -m reserved-blocks-percentage
          Specify the percentage of the filesystem blocks reserved for the
          super-user.   This  avoids  fragmentation, and allows root-owned
          daemons, such as syslogd(8), to continue to  function  correctly
          after non-privileged processes are prevented from writing to the
          filesystem.  The default percentage is 5%.