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