🙆

ファイルディスクリプタの存在意義

に公開

ファイルディスクリプタはプロセスの入出力の代理ファイル

ファイルディスクリプタ(FD)について調べてみた。
FDはLinuxのプロセスが外部とやり取りをする際に使われる。
UNIXの哲学上全てはファイルとしてやりとりされる。

プロセスがネットワークであれ、ファイルであれ、読み込みや書き込みを行おうとすると、プロセスから見るとFDに対して接続を行う。
FDはプロセスごとにカーネルが管理するテーブルが存在する。
そのテーブルでは整数値と接続先がマッピングされている。

各プロセスに存在する標準入力、標準出力、標準エラー出力の整数値は、順番に0,1,2が割り当てられている。
その接続先が実際に何になるかは親プロセスから引き継がれる。

SSHで接続するとコマンド実行結果がターミナルに表示されるのは、SSHによって起動されるプロセスの標準出力がPTYになっているからだ。

実際のプロセスを見てみる

FDは/proc/<PID>/fd/を覗くと見れる。
FDの整数値がリンク名になっており、接続先がリンク先になっている。
この例では0,1,2があり、リンク先はdev/pts/0になっている。

# sleep 300 &
[1] 846619

# ll /proc/846619/fd
total 0
lrwx------ 1 root root 64 Jul 26 19:11 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jul 26 19:11 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jul 26 19:11 2 -> /dev/pts/0

lsofでも見てみる

# lsof -p 848022
COMMAND    PID   USER  FD   TYPE   DEVICE SIZE/OFF     NODE NAME
bash    848022 xx   0u  IPv4 42315792      0t0      TCP localhost:47402->localhost:4444 (ESTABLISHED)
bash    848022 xx   1u  IPv4 42315792      0t0      TCP localhost:47402->localhost:4444 (ESTABLISHED)
bash    848022 xx   2u   CHR    136,7      0t0       10 /dev/pts/7

Discussion