GNU/Linux >> Tutoriales Linux >  >> Linux

¿Quién tiene el otro extremo de este par de sockets de Unix?

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 .


Linux
  1. ¿Las verdades sobre el malware en Unix/Linux?

  2. ^M al final de cada línea en vim

  3. ¿Cómo usar la opción SO_KEEPALIVE correctamente para detectar que el cliente en el otro extremo está inactivo?

  4. Cómo encontrar el tamaño del búfer de socket de Linux

  5. ¿Cómo funcionan las opciones '-s', '-t' y '-c' del comando tr en Unix?

Linux vs Unix:¿Cuál es la diferencia?

Revisitando la filosofía Unix en 2018

¿Cuál es la diferencia entre Linux y Unix?

Encuentra qué proceso está en el otro extremo de una tubería

¿Cuál es el alcance de las variables de shell exportadas en Unix?

Toma de dominio Sniff UNIX