GNU/Linux >> Linux の 問題 >  >> Linux

このUnixソケットペアのもう一方の端を手に入れたのは誰ですか?

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内 。


Linux
  1. Linuxの哲学は2019年も引き続き関係がありますか?

  2. ファイルの最後に改行を追加するにはどうすればよいですか?

  3. Unix / Linuxのマルウェアに関する理論?

  1. vim の各行末に ^M

  2. SO_KEEPALIVE オプションを適切に使用して、相手側のクライアントがダウンしていることを検出するにはどうすればよいですか?

  3. Linuxのソケットバッファサイズを見つける方法

  1. LinuxとUnix:違いは何ですか?

  2. パイプの反対側にあるプロセスを見つける

  3. export の Unix シェル変数のスコープは何ですか?