地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Linux】O_LARGEFILEフラグ

linuxjm.osdn.jp

O_LARGEFILEというフラグを見つけ気になったのでメモ。

O_LARGEFILE
(LFS) off_t ではサイズを表せない (だだし off64_t ではサイズを表せる)ファ イルをオープン可能にする。この定義を有効にするためには、(どのヘッダーファイ ルをインクルードするよりも前に) _LARGEFILE64_SOURCE マクロを定義しなければ ならない。 32 ビットシステムにおいて大きなファイルにアクセスしたい場合、 (O_LARGEFILE を使うよりも) _FILE_OFFSET_BITS 機能検査マクロを 64 に セットする方が望ましい方法である (feature_test_macros(7) を参照)。

open時にoff_tサイズを超えるサイズのファイルの場合に必要となるフラグ。

linux/fs.h at 29c395c77a9a514c5857c45ceae2665e9bd99ac7 · torvalds/linux · GitHub

で、定義しておけば大体2GBのファイルまで取り扱うことができる。

#define MAX_NON_LFS ((1UL<<31) - 1) # = 大体2GB

ただ、off_t自体が以下のようになっていて最近の64bitマシンだったらあまり気にしなくてもoff64_tが自動で使われるっぽい。32btiマシンを使う際にでかめのファイルを取り扱いたいケースとかで使えたりするんですかね?

    148 #if defined(_LP64) || _FILE_OFFSET_BITS == 32
    149 typedef long     off_t;     /* offsets within files */
    150 #elif _FILE_OFFSET_BITS == 64
    151 typedef longlong_t    off_t;     /* offsets within files */
    152 #endif
    153 
    154 #if defined(_LARGEFILE64_SOURCE)
    155 #ifdef _LP64
    156 typedef   off_t      off64_t;    /* offsets within files */
    157 #else
    158 typedef longlong_t    off64_t;    /* offsets within files */
    159 #endif
    160 #endif /* _LARGEFILE64_SOURCE */