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 */