/proc/PID/fd/X リンク番号

/proc/PID/fd/X リンク番号

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。この数字は何を表しますか?

ベストアンサー1

これはインデックスノード接続されたパイプまたは出口の番号。

パイプは、書き込み端と読み取り端を持つ一方向チャネルです。あなたの例では、inode番号が同じであるため、FD 5とFD 6が互いに通信しているようです。 (しかしそうではないかもしれません。下記を参照してください。)

プログラムがパイプを介して独自に通信するよりも一般的なのは、互いに通信する一対の個別のプログラムです。これは通常、シェルを使用して2つのプログラム間にパイプを設定するためです。

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)がinode番号222536390のパイプに接続され、PID 4243(FD 0)の標準入力が同じパイプに接続されることを意味します。

lsこれはすべて、出力が入力lessに送信されていると言う長い方法です。

あなたの例に戻ると、FD 1とFD 2はほぼ確実です。いいえお互いに会話。これは、stdout(FD 1)とstderr(FD 2)を一緒に束ねて、両方が同じターゲットに移動した結果である可能性が高いです。 Bourneシェルを使用して、次のようにこれを実行できます。

$ some-program 2>&1 | some-other-program

したがって、を見ると、/proc/$PID_OF_SOME_OTHER_PROGRAM/fdパイプラインに接続されている3番目のFDがインスタンスに接続されているFD 1と2と同じinode番号を持っていることがわかりますsome-program。あなたの例では、FD 5と6でもこれが起こる可能性がありますが、これら2つのFDがどのように接続されるかについての準備された理論はありません。これを理解するには、プログラム内で何が起こっているのかを知る必要があります。

おすすめ記事