当设备上没有剩余空间时,为啥 error() 返回 EPERM - 我希望 ENOSPC

Posted

技术标签:

【中文标题】当设备上没有剩余空间时,为啥 error() 返回 EPERM - 我希望 ENOSPC【英文标题】:Why is ferror() returning EPERM when there is no space left on device - I would expect ENOSPC当设备上没有剩余空间时,为什么 error() 返回 EPERM - 我希望 ENOSPC 【发布时间】:2011-08-12 15:10:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

可能是因为在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%.

【讨论】:

以上是关于当设备上没有剩余空间时,为啥 error() 返回 EPERM - 我希望 ENOSPC的主要内容,如果未能解决你的问题,请参考以下文章

Windows 上的 GCC 设备上没有剩余空间

错误:无法写入临时文件的块 37583345:设备上没有剩余空间

错误:由于环境错误而无法安装软件包:[Errno 28] 设备上没有剩余空间

Java“设备上没有剩余空间”但磁盘上有足够的空间?

MongoDB在带有docker的设备上没有剩余空间

设备上没有剩余空间[关闭]