【ふぁいるでぃすくりぷた】

ファイルディスクリプタ とは?

💡 OSが管理するファイルの「整理番号」、開いているリソースを識別する整数
📌 このページのポイント
ファイルディスクリプタの仕組み プロセス FD 種別 0 stdin 1 stdout 2 stderr 3 file 4 socket キーボード 標準入力 画面 標準出力 エラー出力 stderr ファイル ネット ワーク 整数でI/Oリソースを管理
ファイルディスクリプタの仕組み
ひよこ ひよこ

ファイルディスクリプタって何?

ペンギン先生 ペンギン先生

プログラムがファイルを開くと、OSが「このファイルは3番」のように番号(FD)を割り振る。その後は「3番のFDに書いて」とOSに伝えるだけでファイルにアクセスできる。ファイル名を毎回使わなくていい仕組みだよ。

ひよこ ひよこ

0・1・2が特別な理由は?

ペンギン先生 ペンギン先生

プロセス起動時に自動で割り当てられる:0=標準入力(キーボード)・1=標準出力(画面)・2=標準エラー出力(エラー出力)。「2>&1」というシェルの書き方はFD2(エラー)をFD1(標準出力)にリダイレクトするという意味。

ひよこ ひよこ

「too many open files」エラーって?

ペンギン先生 ペンギン先生

1つのプロセスが開けるFDの数には上限がある(Linuxデフォルトは通常1024〜65536)。大量のファイルやネットワーク接続を開くアプリで上限を超えるとこのエラーが出る。ulimit -nで確認・変更できる。

ひよこ ひよこ

リダイレクトってファイルディスクリプタと関係があるの?

ペンギン先生 ペンギン先生

大いに関係がある。「command > output.txt」はFD1(標準出力)をoutput.txtに向ける操作。「command 2> error.log」はFD2(標準エラー出力)をerror.logに向ける。Linuxリダイレクトの仕組みはFDの概念そのものなんだ。

ひよこ ひよこ

ソケット通信もファイルディスクリプタを使うの?

ペンギン先生 ペンギン先生

使うよ。Linuxの「Everything is a file」哲学で、ネットワーク接続も特殊なFDとして扱われる。WebサーバーがHTTPリクエストを受けるとソケットFDが割り当てられ、読み書きはファイルと同じsyscallで行う。だから高負荷なWebサーバーはulimitのFD上限を65536以上に引き上げるのが定番のチューニングなんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
ファイルディスクリプタって出てきたら「プロセスが開いているファイルやソケットをOSが管理するための整数識別子」と思えばOK!
📖 おまけ:英語の意味
「File Descriptor」 = ファイルの記述子・識別子
💬 「descriptor」は「記述するもの・識別子」の意味。プロセスがアクセスするファイルを「記述(describe)」する整数値
← 用語集にもどる