2011-08-12 2 views
1

cstdioを使用してLinux上にC++アプリケーションを作成しました。これは、デバイス全体をランダムなデータで上書きする必要がある1つの関数を含んでいます。ファイル名が与えられ、ランダムなデータのブロックがメモリに作成され、ファイルにfwrite()を使用して順次書き込まれます。 デバイスがいっぱいの場合は、関数が返されます。別の書き込みエラーがある場合、例外がスローされます。 エラーが発生したときにferror()に尋ね、これが "ディスクがいっぱい"であるかどうかを認識したい - 別のエラーです。 ディスクが一杯になったときにENOSPCを取得する予定です。しかし関数はディスクに書き込みを行い、いっぱいになるとferror()が返す値は1(EPERM)になります。その一方で、 perrorは正しい "No space left on device"を表示します。 これは私のC++ライブラリのバグですか?または、EPERM正しいエラーコードですか? 正しいエラーコードの場合は、ディスクがいっぱいになってこの特定のエラーを認識するのに適したEPERMが返されますか?デバイスにスペースがないときにEPERMを返すのはなぜですか?ENOSPC

答えて

2

ferrorは、ストリームにエラーがあるかどうかを示します。実際にエラーが何かを確認するには、errnoを調べる必要があります。

perrorは、errnoを調べるため、正しいエラーメッセージが表示されます。

0

これは、カーネルやデバイスドライバのバグである可能性が高い私のC++のlibs

のバグです。しかしどちらもそうは思わない。

1

ferrorerrnoの値を返さないものとします。ストリームエラーが発生した場合はゼロ以外の値を返します。 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%. 
関連する問題