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
.