当设备上没有剩余空间时,为啥 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的主要内容,如果未能解决你的问题,请参考以下文章
错误:无法写入临时文件的块 37583345:设备上没有剩余空间