GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wer hat das andere Ende dieses Unix-Socketpaars?

Ich möchte feststellen, welcher Prozess das andere Ende eines UNIX-Sockets hat.

Insbesondere frage ich nach einem, das mit socketpair() erstellt wurde , obwohl das Problem für jeden UNIX-Socket dasselbe ist.

Ich habe ein Programm parent wodurch ein socketpair(AF_UNIX, SOCK_STREAM, 0, fds) erstellt wird , und fork() s. Der übergeordnete Prozess schließt fds[1] und behält fds[0][code> kommunizieren. Das Kind macht das Gegenteil, close(fds[0]); s=fds[1][code> . Dann das untergeordnete exec() s ein anderes Programm, child1 . Die beiden können über dieses Socketpair hin und her kommunizieren.

Nehmen wir nun an, ich kenne den Elternteil ist, aber ich möchte herausfinden, wer child1 ist ist. Wie mache ich das?

Mir stehen mehrere Tools zur Verfügung, aber keines kann mir sagen, welcher Prozess sich am anderen Ende des Sockets befindet. Ich habe versucht:

  • lsof -c Programmname
  • lsof -c parent -c child1
  • ls -l /proc/$(pidof-server)/fd
  • cat /proc/net/unix

Grundsätzlich kann ich die beiden Steckdosen und alles darüber sehen, aber nicht sagen, dass sie verbunden sind. Ich versuche festzustellen, welcher FD im Elternprozess mit welchem ​​Kindprozess kommuniziert.

Akzeptierte Antwort:

Seit Kernel 3.3 ist dies mit ss möglich oder lsof-4.89 oder höher — siehe Antwort von Stéphane Chazelas.

In älteren Versionen, laut dem Autor von lsof , war es unmöglich, dies herauszufinden:Der Linux-Kernel stellt diese Informationen nicht zur Verfügung. Quelle:Thread von 2003 auf comp.unix.admin.

Die Zahl, die in /proc/$pid/fd/$fd angezeigt wird ist die Inode-Nummer des Sockets im virtuellen Socket-Dateisystem. Wenn Sie ein Rohr- oder Buchsenpaar erstellen, erhält jedes Ende nacheinander eine Inode-Nummer. Die Nummern werden fortlaufend vergeben, daher besteht eine hohe Wahrscheinlichkeit, dass sich die Nummern um 1 unterscheiden, aber dies ist nicht garantiert (entweder weil der erste Socket N war und N +1 wurde aufgrund von Wrapping bereits verwendet oder weil ein anderer Thread zwischen den beiden Inodes-Zuweisungen geplant war und dieser Thread auch einige Inodes erstellte).

Ich habe die Definition von socketpair überprüft in Kernel 2.6.39, und die beiden Enden des Sockets sind nicht korreliert, außer durch das typspezifische socketpair Methode. Für Unix-Sockets ist das unix_socketpair in net/unix/af_unix.c .


Linux
  1. Addieren Sie eine Spalte mit Zahlen in der Unix-Shell

  2. erlang:UNIX-Domain-Socket-Unterstützung?

  3. Wie verwendet man die Option SO_KEEPALIVE richtig, um zu erkennen, dass der Client am anderen Ende ausgefallen ist?

  4. So finden Sie die Socket-Puffergröße von Linux

  5. Wie funktionieren die Optionen „-s“, „-t“ und „-c“ des tr-Befehls in Unix?

Linux vs. Unix:Was ist der Unterschied?

Überarbeitung der Unix-Philosophie im Jahr 2018

Was ist der Unterschied zwischen Linux und Unix?

Finden Sie heraus, welcher Prozess sich am anderen Ende einer Pipe befindet

Welchen Umfang haben exportierte Unix-Shell-Variablen?

Was bedeutet das @-Symbol am Anfang eines Unix-Domain-Socket-Pfads in Linux?