ファイル記述子

ファイル記述子（ファイルきじゅつし、）とは、コンピュータプログラミングにおいてファイルへの参照を抽象化したキーである。ファイルディスクリプタあるいはFDとも呼ばれる。UNIX系システムでテキストターミナルを含むファイルストリームを参照する際に用いられる。
MS-DOSやMicrosoft Windowsでは、「ファイルハンドル」がほぼ相当するが、技術的には異なるオブジェクトである。
概要.
POSIXでは、ファイル記述子は整数型の値であり、詳述すればC言語のcodice_1型である。POSIXでは、全てのプロセスが持つべき3つのファイル記述子を定義している（デーモンなどはその限りではない）。
一般にファイル記述子は、オープン中のファイルの詳細を記録するカーネル内データ構造（配列）へのインデックスである。POSIXでは、これをファイル記述子テーブルと呼び、各プロセスが自身のファイル記述子テーブルを持つ。ユーザーアプリケーションは抽象キー（＝ファイル記述子）をシステムコール経由でカーネルに渡し、カーネルはそのキーに対応するファイルにアクセスする。アプリケーション自身はファイル記述子テーブルを直接読み書きできない。
UNIX系システムでは、ファイル記述子がファイルだけでなく、ディレクトリ、ブロックデバイスやキャラクターデバイス（スペシャルファイルとも呼ぶ）、ソケット、FIFO（名前付きパイプ）、名前なしパイプなどのカーネルオブジェクトを汎用的に参照するのに使われる。
標準Cライブラリの、codice_2型（ライブラリが管理するデータ構造）へのポインタ（codice_3）があらわすものをストリームと言い、POSIXではファイル記述子とストリームを包括する用語として「ハンドル」を使っている（参考: "Interaction of File Descriptors and Standard I/O Streams"）。『プログラミング言語C』第2版ではcodice_3を「ファイル・ポインタ」と呼んでいる。原著『The C Programming Language』では「file pointer」と呼んでいる。codice_2型の実装は規格で規定されていないが、通例構造体であり、UNIX系システムでは一般に低レベルのファイル記述子を含んでいる。これらはプラットフォームではなくプログラミング言語によって標準化された上位層のコンセプトであるため、ファイル記述子と同一視はできない。
MS-DOS・Microsoft Windows.
Microsoft Windowsカーネルでは、ファイル記述子と同様であるが、より汎用的な機構によりファイルオブジェクトを含むさまざまなカーネルオブジェクトを「ハンドル」という抽象的な識別子に関連づける枠組が採用されている。特にファイルを表すカーネルオブジェクトに関連づけられたハンドルを「ファイルハンドル」と呼ぶが、これはPOSIXにおけるファイル記述子とほぼ同等の役割を担うものと解釈することができる。このファイルハンドルは、前述の(ファイル)ハンドルとは異なるものを指すが、同一の語のため、混乱を生じることがある。（MS-DOSではファイル記述子ほぼそのものを指して「ファイルハンドル」と呼んでいた）
マイクロソフトのCランタイムライブラリ (CRT) は、C標準I/Oライブラリとは別に、POSIX互換関数群として、オペレーティングシステムにおけるネイティブのファイルハンドルとPOSIX的な整数のファイル記述子を相互変換して扱える機能を持っている。
ファイル記述子に関する操作.
のUNIX系システムが提供するファイル記述子関連の操作（システムコールとライブラリ関数）は以下の通りである。
ケイパビリティとしてのファイル記述子.
UNIXのファイル記述子は、一種のケイパビリティである。sendmsg() システムコールを使うとプロセス間でファイル記述子をやり取りすることができる。つまり、UNIXのプロセスが持つファイル記述子テーブルは「ケイパビリティリスト (C-list)」の実例と見ることもできる。