2011-08-12 62 views
1

我使用cstdio在linux上編寫了一個C++應用程序。它包含一個應該用隨機數據覆蓋整個設備的函數。它被賦予一個文件名,在內存中創建隨機數據塊,並使用fwrite()將它們依次寫入文件。 如果設備已滿,則應返回該功能。如果存在不同的寫入錯誤,則應該拋出異常。 所以當發生錯誤時,我會詢問ferror()並且想要識別這是否是「磁盤已滿」 - 一個不同的錯誤。 當磁盤已滿時,我希望獲得ENOSPC。但函數寫入磁盤,當它滿時,ferror()返回的值爲1(這是EPERM)。另一方面,錯誤 會打印出正確的「設備上沒有剩餘空間」。 這是我的C++庫中的錯誤嗎?或者EPERM是正確的錯誤代碼? 如果它是正確的錯誤代碼,EPERM僅在磁盤已滿時返回,因此適合識別此特定錯誤?爲什麼當設備上沒有剩餘空間時,ferror()返回EPERM - 我期望ENOSPC

回答

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%. 
相關問題