大規模ファイルを扱うには - 2Gの壁とLSF仕様

誰もが自分自身の視野の限界を世界の限界だと思い込んでいる。
アーサー・ショーペンハウエル
32bitの符号付き整数の最大値は2G、符号無しなら4G。それ以上は表せません。そのため、いわゆる2Gの壁、4Gの壁と呼ばれるものがあります。代表的なものはファイルサイズ、そして、メモリサイズです。まだメモリが2GB以上ということはそれほど多くはありませんが、ファイルサイズに関しては2GB以上のものも少なくありません。例えば、TV番組を録画した動画ファイル、DVDのイメージ等々。今回は、2GB以上の大規模ファイルを扱うためLSFについて説明します。

最近のLinuxやBSDだと、デフォルトでカーネルは2GB以上のファイルにLSFとは対応していますし、プログラムも対応しています。NFS(Server/Client)等のデーモン、Appach等のサーバ、cp、cmp等のfileを扱うプログラム等々。そのため、Linuxをデフォルトのままデスクトップとして使っている間は、あまり大規模ファイルのサポートについてはあまり意識する必要はないかもしれません。

しかし、後からプログラムをソースからmakeしてinstallする場合や、自ら開発する上ではこの2GBの壁について意識する必要があります。これを意識せずにコンパイルを行うと、2GB以上のファイルアクセスができなかったり、時には思わぬバグを引き起こしたりする危険性があります。

大規模ファイルアクセスのための仕様はLFS仕様(Large File Summit specification)として規定されたものがあり、Linux(glibc)等もこれに従っています。まずこのLFS仕様を説明します。

現行APIの拡張

従来のファイルアクセスのインタフェースでは、各パラメータは32bit値になっているため、2GB以上の大規模ファイルを正しく扱えません。そのため、LSFでは、このようなファイルに対して処理を実行できない場合や属性を正しく表現できない場合は、適切なエラーとして処理するようになっています。たとえば、open()は、2GB 以上のファイルに対してはエラーとなり、errnoにEOVERFLOW に設定します。

移行用API (transitional API)

LFS は、32bitから64bitへの移行用として、従来の32bitアクセスのAPIとは別に、それぞれのAPIに対応する64bit版のAPIを定義しています。例えば、open()に対するopen64()、seekに対するseek64、stdio.h系のAPIに関しても同様に、fopen()に対するfopen64()等 。これに伴って方の方もオフセットoff64_t が定義されています。

コンパイル環境

◎通常のコンパイル環境 (regular compilation environment)
これは既存のコンパイル環境であり、通常の32bit版のAPIがそのまま使用されます。

◎移行用コンパイル環境 (transitional compilation environment)
通常の32bit版のAPIに加えて、移行用の64bit版API使用可能になります。従来のプログラムには影響を与えませんが、64bit対応するためには、明示的にopen64()等を使用する必要があります。
_LARGEFILE64_SOURCEマクロを1に設定することによって、64bit版APIが使用可能になります。

◎「大規模ファイル」コンパイル環境 (`large file' compilation environment)
この環境では、ファイルアクセスの全APIが64bit対応になります。従来のAPIは全て64bit版にマップ(リダイレクト)されます。具体的には、open()コールはopen64コールにマップされます。この環境では、型定義も64bit版に置き換えられるので、従来のプログラムをこの環境でリコンパイルする場合は、その影響を考慮する必要があります。
_FILE_OFFSET_BITSマクロに64を定義することによって、この環境になります。

gccで大規模ファイル対応のコンパイル

最近のgcc(glibc)ではLSF使用に対応しています。よって、プログラムを2GB以上のファイルに対応させる場合は、makefile等で、
CPPFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
等と書いてやればOKです。

4797328355【関連書籍】
GCC GNU C Compiler―Manual & Reference 遠藤 俊徳
プログラミング言語C ANSI規格準拠 B.W.カーニハン D.M.リッチー
Cプログラミングの落とし穴 A.コーニグ
Linux マルチメディアソフト集

コメント

非公開コメント

トラックバック

Linux マルチメディアソフト集

Linux マルチメディアソフト集

Linuxでのファイルサイズの最大値

自分の環境用のメモ 何m考えずにプログラムを組んでいたら、自分の環境ではファイルサイズの最大値が 2GB だったらしい。 OSはVine Linux。 $ unam...

本のおすすめ

4274065979

4844337858

482228493X

4904807057

4873114799


プロフィール

  • Author:proger
  • 組み込み関係で仕事してます

ブログ内検索