
コンピューティングにおいて、ファイル記述子はファイルにアクセスするための抽象キーです。この用語は通常、 POSIXオペレーティング システムに対して使用されます。 Microsoft Windows の用語および stdio.h ライブラリのコンテキストでは、ファイルハンドルという用語が好まれますが、技術的には別のオブジェクトです。以下を参照してください。
POSIX では、ファイル記述子は整数であり、より具体的には C 言語ではint型の整数です。デーモンではないプロセスには、次の 3 つの標準 POSIXファイル記述子があります。
| 整数値 | 名前 |
|---|---|
| 0 | 標準入力 (stdin) |
| 1 | 標準出力 (stdout) |
| 2 | 標準誤差 (stderr) |
一般に、ファイル記述子はカーネル常駐ファイル内のエントリのインデックスです。
開いているすべてのファイルの詳細を含むデータ構造。
POSIX では、このデータ構造をファイル記述子テーブルと呼びます。そして、各プロセスには独自のファイル記述子テーブルがあります。ユーザー アプリケーションはシステム コールを通じて抽象キーをカーネルに渡し、カーネルはアプリケーションに代わってこのキーを使用してファイルにアクセスします。アプリケーションはファイル記述子テーブルを直接読み書きすることはできません。
Unixシステムでは、ファイル記述子は、ファイル、ディレクトリ、ブロックまたはキャラクタ デバイス (特殊ファイルと呼ばれることが多い)、名前付きパイプ、または匿名パイプを表すことができます。
C 標準 I/O ライブラリのFILE *ファイルハンドルは、技術的には、このライブラリのルーチンによって管理されるデータ構造へのポインタです。 Unix システムでは、これらの構造の 1 つに、問題のオブジェクトのファイル ハンドルが含まれています。ファイル ハンドルという名前はこの追加の層を指すため、ファイル ハンドルの名前と互換性はありません。
用語をさらに複雑にするために、 Microsoft Windows では、下位レベルの構造、つまり POSIX ファイル ハンドルを指すためにファイル ハンドルという用語も使用します。 Microsoft C ライブラリは、上記の POSIX スタイルのファイル記述子規則をサポートするために、これらのネイティブ ハンドルを「ラップ」する互換性関数も提供します。
ファイル記述子の操作
最新の Unix は通常、ファイル記述子に対して次の操作を提供します。
ファイル記述子を作成するためのシステムコール
- open()、open64()、creat()、creat64()
- ソケット()
- ソケットペア()
- パイプ()
単一のファイル記述子に対する操作
- 読み取り()、書き込み()
- 受信()、送信()
- recvmsg()、sendmsg() (ファイル記述子を別のプロセスに送信できます)
- sendfile()
- lseek()、lseek64()
- fstat()、fstat64()
- fchmod()
- fchown()
複数のファイル記述子に対する操作
- select()、pselect()
- ポーリング()

ファイル記述子テーブルの操作
- 近い()
- dup()
- dup2()
- fcntl (F_DUPFD)
- fcntl (F_GETFD および F_SETFD)
プロセスの状態を変更する操作
- fchdir(): ディレクトリ ファイル記述子に基づいてプロセスの現在の作業ディレクトリを設定します。
- mmap(): ファイルの一部をプロセスのアドレス空間にマップします。
ファイルロック
- 群れ()
- fcntl (F_GETLK、F_SETLK、および F_SETLKW)
- ロックフ()
ソケット
- 接続する()
- バインド()
- 聞く()
- accept(): 受信接続用の新しいファイル記述子を作成します。
- 取得靴下名()
- getピア名()
- getsockopt()、setsockopt()
- shutdown(): 全二重接続の一方または両方の端を閉じます。
その他
- ioctl(): 単一のファイル記述子に対する多様な操作の大規模なコレクション。多くの場合、デバイスに関連付けられます。

ファイル記述子と容量
Unix ファイル記述子は機能です。これらは、sendmsg() システム コールを使用して Unix ドメイン ソケットのプロセス間で受け渡すことができます。
Unix ファイル記述子テーブルは C リストの例です。
