|
用語と概念小規模ファイル (small file)小規模ファイルとは、サイズが 2 GB 未満 (すなわち <= (2 31 - 1) バイト) の通常ファイルのことです。 大規模ファイル (Large file)大規模ファイルとは、サイズが従来の上限 2 GB 以上 (すなわち >= 2 31バイト) の通常ファイルのことです。 大規模ファイル対応可能 (large file safe)大規模ファイルに出会ったときに、データ損失やデータ異常を起こさないアプリケーションを、大規模ファイル対応可能と呼びます。言い換えれば、このようなアプリケーションは、大規模ファイルを処理しませんが、ファイル操作関数によって検出されたエラーを適切に扱う論理が組み込まれています。 大規模ファイル処理可能 (large file aware)小規模ファイルの場合と同一の機能によって大規模ファイルを処理できるように改修されたアプリケーションを、大規模ファイル処理可能と呼びます。このようなアプリケーションは、大規模ファイルを入力として扱い、大規模ファイルを出力として生成することが可能でなければなりません。ただし、この機能要件はアプリケーションが直接の処理の対象とするファイル集合を対象として適用され、必ずしもそのプログラム内の全ファイル・アクセスに適用される条件ではありません。たとえば、あるアプリケーションがデータ・ファイルに関しては大規模ファイル処理可能であるけれども、構成ファイルに関しては大規模ファイル対応可能であるにすぎないという場合もあります (構成ファイルが大規模ファイルのサイズまで拡大することは稀です)。 LFS 仕様 (Large File Summit specification)LFS は Large File Support Specification を作成してきた組織です。 LFS の詳しい進行状況については、LFS のURL( 現行 API の拡張LFS は、現行のインタフェースの動作を拡張して、大規模ファイルに対して処理を実行できない場合や属性を正しく表現できない場合は、適切なエラーとして処理するように変更しました。たとえば、open() は、サイズが 2 GB 以上の通常ファイルに出会ったとき、errno を EOVERFLOW に設定します。 移行用 API (transitional API)LFS は、移行用 API、すなわち 64-bit 関数と 64-bit データ型を定義しました。これらのインタフェースは、大規模ファイルと小規模ファイルの両方への正しいアクセスを提供します。この仕様は、ファイル・オフセットを渡す (または戻す) 各関数 xxx() に対して xxx64() という名前の新しい関数を提供し、ファイル・オフセットに関連する各データ型 xxx_t に対して xxx64_t という名前の新しいデータ型を提供します。たとえば、LFS 仕様では大規模ファイルを扱う関数 open64() とオフセット off64_t が定義されています。 コンパイル環境通常のコンパイル環境 (regular compilation environment)これは既存のコンパイル環境であり、すべてのソース・インタフェース xxx() が、バイナリ出力の中で xxx() の呼び出しにマップされます。すべてのインタフェースは小規模ファイル (32-bit オフセット) を想定しており、大規模ファイルに出会ったときは適切なエラーを戻します。この環境はアプリケーションを大規模ファイル対応可能にするのに十分な環境です。 移行用コンパイル環境 (transitional compilation environment)移行用コンパイル環境は、通常のすべての 32-bit 関数と 32-bit データ型のほかに、明示的な 64-bit 関数と 64-bit データ型をエクスポートします。たとえば、プログラムのソースでは xxx() と xxx64() の両方を使用できます。大規模ファイルを操作するアプリケーションは xxx64() を使用しなければなりません。この環境では、プログラムは xxx()、xxx64()、またはその両方のインタフェースを使用できます。 システム・ヘッダをインクルードする前に _LARGEFILE64_SOURCE を 1 に設定すると、64-bit 移行用インタフェースが使用可能になります。 「大規模ファイル」コンパイル環境 (`large file' compilation environment)この環境では、すべてのソース・インタフェース xxx() が、バイナリ出力の中で xxx64() の呼び出しにマップされます。また、この環境では、POSIX データ型が正しいサイズに定義されることが保証されます (すなわち、off_t は long long の 64-bit エンティティに型定義 (typedef) されます)。この環境でコンパイルされたプログラムは、移行用の xxx64() インタフェース呼び出しを明示的に使用せずに、xxx() ソース・インタフェースを用いて大規模ファイルにアクセスできます。この環境でプログラムが使用できるインタフェースはxxx() だけであり、この形式の関数が小規模ファイルと大規模ファイルの両方を操作します。 システム・ヘッダをインクルードする前に _FILE_OFFSET_BITS を 64 に設定すると、64-bit インタフェースが使用可能になります。 このマクロを定義しないか、または 32 に設定すると、上記の通常のコンパイル環境となります。 open( ) の保護機構予想外のデータ損失を防ぐため、通常のコンパイル環境では、大規模ファイルに対する open() システム・コールは異常終了します。open() では、ファイルをオープンする前に、そのサイズが 32-bit 値で表現可能な最大オフセットを超えないことが確認されます。open() が正常終了すると、オープン・ファイル記述子の中の新しい最大オフセット (offset maximum) フィールドが、ターゲット環境で正常に操作可能な最大ファイル・サイズに設定されます。 read() や write() のようなその他の呼び出しは、この最大オフセット値を参照し、それを超える処理を拒否します。この機構は、プログラムを大規模ファイル対応可能にするために不可欠の部分です。 [ 前の頁へ | 目次 | 次の頁へ] | ||||||||||||||