
stat(2)
適切なバッファを割り当てることができるように、システムコールを使用してファイルサイズを決定しようとしています。具体的には、stat.st_size
システムコールで埋められた構造体を使用しています。
しかし、デバッグ中にファイルが十分に大きいと問題が発生する可能性があることがわかりました。struct stat
マニュアルページでは、これを次のように定義します。
struct stat {
// ...
off_t st_size; /* total size, in bytes */
// ...
};
where は whichst_size
と定義され、which は驚くべきことに does not です。もちろん、これは十分に大きいファイルが整数をオーバーフローし、値が負の数を表す問題につながります。私の小切手の口座(なぜ負数ですか?)off_t
long int
unsigned long int
st_size
また、マニュアルページEOVERFLOW
によると、システムコールはブロック数をに表示できない場合はエラーを返す必要がありますoff_t
が、gcc 9.3を使用するローカルUbuntuでは0x80000000
バイトより大きいサイズのファイルではこれらのエラーは発生しません。また、「正しい」方法は、フィールドを32ビット整数から64ビット整数に拡張する-D_FILE_OFFSET_BITS=64
ようにコンパイルすることです。これは、より大きなファイルを管理するのに役立ちます。off_t
これは間違いなく私の問題を解決しましたが、まだ疑問に思っています。定義を符号付き整数に保つのはなぜですか?