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
と表示される。