Quiero determinar qué proceso tiene el otro extremo de un socket UNIX.
Específicamente, estoy preguntando sobre uno que fue creado con socketpair()
, aunque el problema es el mismo para cualquier socket UNIX.
Tengo un programa parent
que crea un socketpair(AF_UNIX, SOCK_STREAM, 0, fds)
y fork()
s. El proceso padre cierra fds[1]
y mantiene fds[0]
comunicar. El niño hace lo contrario, close(fds[0]); s=fds[1]
. Entonces el hijo exec()
s otro programa, child1
. Los dos pueden comunicarse de un lado a otro a través de este par de enchufes.
Ahora, digamos que sé quién parent
es, pero quiero averiguar quién child1
es. ¿Cómo hago esto?
Tengo varias herramientas a mi disposición, pero ninguna puede decirme qué proceso está en el otro extremo del zócalo. He probado:
lsof -c progname
lsof -c parent -c child1
ls -l /proc/$(pidof server)/fd
cat /proc/net/unix
Básicamente, puedo ver los dos enchufes y todo sobre ellos, pero no puedo decir que estén conectados. Estoy tratando de determinar qué FD en el padre se comunica con qué proceso hijo.
Respuesta aceptada:
Desde el kernel 3.3, es posible usar ss
o lsof-4.89
o superior:consulte la respuesta de Stéphane Chazelas.
En versiones anteriores, según el autor de lsof
, fue imposible averiguarlo:el kernel de Linux no expone esta información. Fuente:subproceso de 2003 en comp.unix.admin.
El número que se muestra en /proc/$pid/fd/$fd
es el número de inodo del socket en el sistema de archivos del socket virtual. Cuando crea un par de tuberías o enchufes, cada extremo recibe sucesivamente un número de inodo. Los números se atribuyen secuencialmente, por lo que existe una alta probabilidad de que los números difieran en 1, pero esto no está garantizado (ya sea porque el primer socket fue N y N +1 ya estaba en uso debido a un ajuste o porque se programó algún otro subproceso entre las dos asignaciones de inodos y ese subproceso también creó algunos inodos).
Revisé la definición de socketpair
en el kernel 2.6.39, y los dos extremos del socket no están correlacionados excepto por el socketpair
específico del tipo método. Para sockets Unix, eso es unix_socketpair
en net/unix/af_unix.c
.