UNIXソケットのもう一方の端がどのプロセスにあるかを確認したい。
具体的には、socketpair()
で作成されたものについて質問しています。 、ただし、問題はどのUNIXソケットでも同じです。
私はプログラムparent
を持っています socketpair(AF_UNIX, SOCK_STREAM, 0, fds)
を作成します 、およびfork()
s。親プロセスはfds[1]
を閉じます fds[0]
を保持します コミュニケーションをとること。子は反対のことをします、close(fds[0]); s=fds[1]
。次に、子のexec()
■別のプログラム、child1
。 2つは、このソケットペアを介して前後に通信できます。
さて、誰がparent
か知っているとしましょう ですが、child1
が誰であるかを知りたいです。 は。どうすればよいですか?
私が自由に使えるツールはいくつかありますが、ソケットの反対側にあるプロセスを知ることはできません。私が試した:
-
lsof -c progname
-
lsof -c parent -c child1
-
ls -l /proc/$(pidof server)/fd
-
cat /proc/net/unix
基本的に、2つのソケットとそれらに関するすべてを見ることができますが、それらが接続されていることはわかりません。親のどのFDがどの子プロセスと通信しているかを判断しようとしています。
承認された回答:
カーネル3.3以降、ss
を使用することが可能です またはlsof-4.89
以上—StéphaneChazelasの回答を参照してください。
lsof
の作成者によると、古いバージョンでは 、これを見つけることは不可能でした:Linuxカーネルはこの情報を公開していません。出典:comp.unix.adminの2003スレッド。
/proc/$pid/fd/$fd
に表示される番号 仮想ソケットファイルシステム内のソケットのiノード番号です。パイプまたはソケットのペアを作成すると、両端がiノード番号を連続して受け取ります。番号は順番に割り当てられるため、番号が1だけ異なる可能性が高くなりますが、これは保証されません(最初のソケットが N であったため)。 およびN +1は、ラッピングのため、または2つのiノード割り当ての間に他のスレッドがスケジュールされていて、そのスレッドもいくつかのiノードを作成したためにすでに使用されていました。
socketpair
の定義を確認しました カーネル2.6.39では、タイプ固有のsocketpair
を除いて、ソケットの両端は相関していません。 方法。 UNIXソケットの場合、それはunix_socketpair
net/unix/af_unix.c
内 。