我使用cstdio在linux上編寫了一個C++應用程序。它包含一個應該用隨機數據覆蓋整個設備的函數。它被賦予一個文件名,在內存中創建隨機數據塊,並使用fwrite()將它們依次寫入文件。 如果設備已滿,則應返回該功能。如果存在不同的寫入錯誤,則應該拋出異常。 所以當發生錯誤時,我會詢問ferror()並且想要識別這是否是「磁盤已滿」 - 一個不同的錯誤。 當磁盤已滿時,我希望獲得ENOSPC。但函數寫入磁盤,當它滿時,ferror()返回的值爲1(這是EPERM)。另一方面,錯誤 會打印出正確的「設備上沒有剩餘空間」。 這是我的C++庫中的錯誤嗎?或者EPERM是正確的錯誤代碼? 如果它是正確的錯誤代碼,EPERM僅在磁盤已滿時返回,因此適合識別此特定錯誤?爲什麼當設備上沒有剩餘空間時,ferror()返回EPERM - 我期望ENOSPC
1
A
回答
2
ferror
只會告訴您流中是否有錯誤。要查看實際發生的錯誤,您必須檢查errno
。
perror
檢查errno
這就是爲什麼它打印正確的錯誤信息。
0
這是在我的C錯誤++庫
更可能是在內核或設備驅動程序中的錯誤。但兩者都不可能。
1
ferror
不應該返回errno
值;它只是在發生流錯誤時返回一個非零值。你應該直接檢查errno
。
1
ferror只是表示發生了一個錯誤,如果您測試了您用來寫入的函數的結果(或fclose的結果),則應該知道這一點。 POSIX強制這些函數(fwrite,fputc,fprintf,fclose)將errno設置爲描述問題的值。
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%.
相關問題
- 1. Appcelerator - 設備上沒有剩餘空間
- 2. Spark:java.io.IOException:設備上沒有剩餘空間
- 3. inet_ntop:設備上沒有剩餘空間
- 4. XFS設備上沒有剩餘空間
- 5. bash:設備上沒有剩餘空間
- 6. 設備上沒有剩餘空間?
- 7. Hadoop當有空間可用時,設備上沒有剩餘空間
- 8. 的Git沒有剩餘空間設備
- 9. AWS S3上的設備上沒有剩餘空間tomcat 8
- 10. 「寫入失敗:設備上沒有剩餘空間」是什麼意思?
- 11. Xcode 6.3中的「設備上沒有剩餘空間」錯誤
- 12. MAT HPROF:設備上沒有剩餘空間
- 13. Android工作室:設備上沒有剩餘空間
- 14. 運行Ubuntu的設備上沒有剩餘空間
- 15. AWS gzip:stdout:設備上沒有剩餘空間
- 16. libv4l2:打開流的錯誤:設備上沒有剩餘空間
- 17. EY無法創建目錄:「」設備上沒有剩餘空間
- 18. 設備上沒有剩餘空間,但SD卡不充滿
- 19. 設備上沒有剩餘空間 - 寫廚師remote_file
- 20. libv4l2錯誤:設備上沒有剩餘空間
- 21. Git推Fortrabbit失敗:設備上沒有剩餘空間
- 22. SharedPreferences.commit失敗,出現java.io.IOException:設備上沒有剩餘空間
- 23. 檢測設備錯誤上沒有剩餘空間
- 24. Android - 如何解決「設備上沒有剩餘空間」錯誤
- 25. Sqoop導入失敗「設備上沒有剩餘空間」
- 26. 如何解決「msgget:設備上沒有剩餘空間」錯誤?
- 27. Docker cgroup.procs在設備上沒有剩餘空間
- 28. 火炬安裝失敗:「沒有剩餘空間在設備上」
- 29. 在Azure Web角色上安裝Numpy時,「設備上沒有剩餘空間」
- 30. Hadoop無法完成作業,因爲「設備上沒有剩餘空間」