Linuxでは、/proc/PID/fd/X
、パイプまたはソケットであるファイル記述子のリンクには、次のような番号があります。
l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 -> socket:[3142930]
lrwx------ 1 user user 64 Mar 24 00:05 8 -> socket:[3142932]
lr-x------ 1 user user 64 Mar 24 00:05 9 -> pipe:[9837788]
最初の行のように:6839。その数字は何を表していますか?
これは、問題のパイプまたはソケットの inode 番号です。
パイプは、書き込み端と読み取り端を持つ単方向チャネルです。あなたの例では、iノード番号が同じであるため、FD 5とFD 6が互いに通信しているように見えます。 (ただし、そうではないかもしれません。以下を参照してください。)
パイプを介してプログラムが自分自身と通信しているのを見ることよりも一般的なのは、互いにシェルでパイプを設定しているために、互いに通信している別個のプログラムのペアです。
Shell-1$ ls -lR / | less
次に、別のターミナルウィンドウで:
Shell-2$ ...find the ls and less PIDs with ps; say 4242 and 4243 for this example...
Shell-2$ ls -l /proc/4242/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 1 -> pipe:[222536390]
Shell-2$ ls -l /proc/4243/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 0 -> pipe:[222536390]
これは、PID 4242の標準出力(慣例によりFD 1)がiノード番号222536390のパイプに接続され、PID 4243の標準入力(FD 0)が同じパイプに接続されていることを示しています。
これらすべては、ls
の出力がless
の入力に送信されていることを示す長い道のりです。
例に戻ると、FD 1とFD 2はほぼ確実にお互いに話していない。ほとんどの場合、これはstdout(FD 1)とstderr(FD 2)を結合した結果であり、両方が同じ宛先に移動します。これは、次のようなBourne Shellで実行できます。
$ some-program 2>&1 | some-other-program
そのため、/proc/$PID_OF_SOME_OTHER_PROGRAM/fd
を調べた場合、some-program
インスタンスのFD 1および2に接続されているのと同じiノード番号を持つ3番目のFDがパイプに接続されていることがわかります。これは、あなたの例のFD 5と6で起こっていることかもしれませんが、これら2つのFDがどのように結び付けられたのかについての理論はまだありません。それを理解するには、プログラムが内部で何をしているのかを知る必要があります。
ソケットの場合、/proc/net/tcp
、/proc/net/udp
、または/proc/net/unix
でiノードの詳細を確認できます。例えば:
ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]
Iノードが53710569であることがわかります。
head -n1 < tcp ; grep -a 53710569 tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
155: 0100007F:001B 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 53710569 1 ffff88011f52c200 300 0 0 2 -1
この場合、これはリスニングソケット(リモートアドレスなし)であり、ローカルポート27(0x1B)でリスニングします。 IPアドレスは「ネットワーク表記」では16進数で4バイトです。inet_ntoa
関数を使用して、標準のa.b.c.d表記(この場合は127.0.0.1)に変換できます。
これらのファイルは0バイトのように見えますが、読み取ると内容が含まれていることに注意してください。また、grepでは-a
が必要であることに注意してください。これは、それらが(たとえば、unix
を使用して)バイナリのように見える場合があるためです。