GNU/Linux >> Linux Esercitazione >  >> Linux

Chi ha l'altra estremità di questa coppia di socket Unix?

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 .


Linux
  1. Linux vs. Unix:qual è la differenza?

  2. La filosofia Linux è ancora rilevante nel 2019?

  3. ^M alla fine di ogni riga in vim

  4. Come utilizzare correttamente l'opzione SO_KEEPALIVE per rilevare che il client all'altra estremità è inattivo?

  5. Come trovare la dimensione del buffer del socket di Linux

Qual è la differenza tra Linux e Unix?

Come convertire una stringa in un numero intero in UNIX

Trova quale processo si trova all'altra estremità di un tubo

Qual è l'ambito delle variabili esportate nella shell Unix?

Sniffa il socket del dominio UNIX

Come trovare l'altra estremità della connessione socket unix?