🙆
ファイルディスクリプタの存在意義
ファイルディスクリプタはプロセスの入出力の代理ファイル
ファイルディスクリプタ(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