メモの日々


2023年12月11日(月) [長年日記]

[unix] procfsからパイプへ割り込む

Linuxでは /proc/[PID]/fd でプロセスが開いているファイルディスクリプタの情報を参照できる。

例えば、次のコマンド

$ cat - | tr [:lower:] [:upper:]

の実行中に /proc にアクセスすると、cat と tr が共通のパイプを読み書きしていることが分かる。

$ ps a | grep 'cat\|tr' | grep -v grep
 8776 pts/16   S+     0:00 cat -
 8777 pts/16   S+     0:00 tr [:lower:] [:upper:]

$ ls -l /proc/8776/fd /proc/8777/fd
/proc/8776/fd:
合計 0
lrwx------ 1 kenichi kenichi 64 12月 11 15:59 0 -> /dev/pts/16
l-wx------ 1 kenichi kenichi 64 12月 11 15:59 1 -> 'pipe:[1252330]'
lrwx------ 1 kenichi kenichi 64 12月 11 15:59 2 -> /dev/pts/16

/proc/8777/fd:
合計 0
lr-x------ 1 kenichi kenichi 64 12月 11 15:59 0 -> 'pipe:[1252330]'
lrwx------ 1 kenichi kenichi 64 12月 11 15:59 1 -> /dev/pts/16
lrwx------ 1 kenichi kenichi 64 12月 11 15:59 2 -> /dev/pts/16

また、パイプを表すディスクリプタに外部から書き込みを行うこともできる。

$ echo hello > /proc/8776/fd/1
$ echo world > /proc/8777/fd/0

これにより、最初に示した cat と tr を実行している端末に

HELLO
WORLD

と表示される。