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

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

最終更新:
💡 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)」する整数値
← 用語集にもどる