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


36

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

回答:


36

これは、問題のパイプまたはソケットのiノード番号です。

パイプは、書き込み終了と読み取り終了のある単方向チャネルです。この例では、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シェルを使用して実行できます。

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

したがって、を突っ込んだ場合/proc/$PID_OF_SOME_OTHER_PROGRAM/fdsome-programインスタンスのFD 1および2に接続されているのと同じiノード番号を持つパイプに接続された3番目のFDが見つかります。これは、あなたの例のFD 5と6で起こっていることかもしれませんが、これら2つのFDがどのように結び付けられたのか、私には準備ができていません。あなたはそれを理解するためにプログラムが内部で何をしているのかを知る必要があります。


1
この例は、pidginパイプやソケットなどがたくさんあるため、良い例だったと思います。最後の質問:iノードは特定のファイルシステムのコンテキストでのみ特定されます、正しいですか?同様に、/ファイルシステムにiノード3を、ファイルシステムに別の(異なる)iノード3を配置でき/bootます。
タナトス

4
はい。以下の場合には/proc、ファイルシステム、iノード番号は、ちょうど(参照オンザフライで構成されているget_next_ino()fs/inode.c、システムが新たに起動されたときに0から開始し、カーネルに)。それらを構成するメカニズムは、POSIXのセマンティクスで要求されていない場合でも、iノード番号一意であるLinuxのいくつかの不整合ファイルシステム(proc、configfs、ramfs、autofs ...)によって共有されます。ただし、これはかなり特殊なケースです。あなたが話しているルールは、通常ext3のような通常の永続的なファイルシステムに関連して参照されます。
ウォーレンヤング

33

ソケットの場合は/proc/net/tcp/proc/net/udpまたはでinodeの詳細を確認できます/proc/net/unix。例えば:

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関数を使用して標準のabcd表記(この場合は127.0.0.1)に変換できます。

これらのファイルは0バイトのように見えますが、読むと内容があります。また-a、grepでは(たとえば、unix)がバイナリであるように見えるため、これが必要であることに注意してください。


IPv6 も/proc/net/tcp6あり/proc/net/udp6ます。
クレイグマックイーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.