stat.st_size型がunsigned intではないのはなぜですか?

stat.st_size型がunsigned intではないのはなぜですか?

stat(2)適切なバッファを割り当てることができるように、システムコールを使用してファイルサイズを決定しようとしています。具体的には、stat.st_sizeシステムコールで埋められた構造体を使用しています。

しかし、デバッグ中にファイルが十分に大きいと問題が発生する可能性があることがわかりました。struct statマニュアルページでは、これを次のように定義します。

struct stat {
    // ... 
    off_t     st_size;    /* total size, in bytes */
    // ... 
};

where は whichst_sizeと定義され、which は驚くべきことに does not です。もちろん、これは十分に大きいファイルが整数をオーバーフローし、値が負の数を表す問題につながります。私の小切手の口座(なぜ負数ですか?)off_tlong intunsigned long intst_size

また、マニュアルページEOVERFLOWによると、システムコールはブロック数をに表示できない場合はエラーを返す必要がありますoff_tが、gcc 9.3を使用するローカルUbuntuでは0x80000000バイトより大きいサイズのファイルではこれらのエラーは発生しません。また、「正しい」方法は、フィールドを32ビット整数から64ビット整数に拡張する-D_FILE_OFFSET_BITS=64ようにコンパイルすることです。これは、より大きなファイルを管理するのに役立ちます。off_t

これは間違いなく私の問題を解決しましたが、まだ疑問に思っています。定義を符号付き整数に保つのはなぜですか?

ベストアンサー1

off_tはいPOSIXで定義

ファイルサイズ。

ファイルサイズだけでなくファイルオフセット(したがって名前)にも使用されるため、負の値を表すことができる必要があります。オフセットは負の数にすることができます(ファイルから戻る)。lseek例えば)。

なぜこれを使用できないのか疑問に思うかもしれませんが、size_tこれはファイルサイズではなくオブジェクト、特にCオブジェクトのサイズを測定するために使用されます。

おすすめ記事