Voglio determinare quale processo ha l'altra estremità di un socket UNIX.
In particolare, ne sto chiedendo uno che è stato creato con socketpair()
, sebbene il problema sia lo stesso per qualsiasi socket UNIX.
Ho un programma parent
che crea una socketpair(AF_UNIX, SOCK_STREAM, 0, fds)
e fork()
S. Il processo padre chiude fds[1]
e mantiene fds[0]
comunicare. Il bambino fa l'opposto, close(fds[0]); s=fds[1]
. Quindi il figlio exec()
s un altro programma, child1
. I due possono comunicare avanti e indietro tramite questa coppia di prese.
Ora, supponiamo che io sappia chi parent
è, ma voglio capire chi è child1
è. Come faccio?
Ci sono diversi strumenti a mia disposizione, ma nessuno può dirmi quale processo si trova all'altra estremità del socket. Ho provato:
lsof -c progname
lsof -c parent -c child1
ls -l /proc/$(pidof server)/fd
cat /proc/net/unix
Fondamentalmente, posso vedere le due prese e tutto ciò che li riguarda, ma non posso dire che siano collegate. Sto cercando di determinare quale FD nel genitore sta comunicando con quale processo figlio.
Risposta accettata:
Dal kernel 3.3, è possibile usare ss
o lsof-4.89
o superiore — vedi la risposta di Stéphane Chazelas.
Nelle versioni precedenti, secondo l'autore di lsof
, era impossibile scoprirlo:il kernel Linux non espone queste informazioni. Fonte:thread del 2003 su comp.unix.admin.
Il numero mostrato in /proc/$pid/fd/$fd
è il numero di inode del socket nel filesystem del socket virtuale. Quando crei una coppia di pipe o socket, ciascuna estremità riceve successivamente un numero di inode. I numeri vengono attribuiti in sequenza, quindi c'è un'alta probabilità che i numeri differiscano di 1, ma questo non è garantito (anche perché il primo socket era N e N +1 era già in uso a causa del wrapping o perché era stato programmato qualche altro thread tra le due allocazioni di inode e anche quel thread ha creato alcuni inode).
Ho controllato la definizione di socketpair
nel kernel 2.6.39, e le due estremità del socket non sono correlate se non per il tipo specifico socketpair
metodo. Per i socket unix, è unix_socketpair
in net/unix/af_unix.c
.