¿Hay un archivo para cada socket?

21

"Todo es un archivo" en el mundo UNIX.

La frase anterior es famosa. Cuando corro echo "hello programmer" >> /dev/tty1, puedo ver la cadena dada en TeleType 1 ...

¿Qué y dónde está el archivo por cada uno socket? Supongamos que mi amigo se conecta a mi PC y su IP es h.h.h.h, ¿cómo puedo acceder al archivo respectivo? ¿Es posible?

Golfo pérsico
fuente
3
La API de socket es en realidad una desviación de la "política de Unix" en este sentido, porque originalmente vino de BSD . Tenga en cuenta que siempre hay un Plan 9 de Bell Labs que es "más Unix que Unix", incluso las API de red y de gráficos son archivos allí.
ntoskrnl
En los documentos del Plan 9 se menciona una cantidad considerable de sockets y procesos, en su mayoría sobre dónde se equivocó el modelo UNIX.
strugee

Respuestas:

9

man 7 unix:

La familia de sockets AF_UNIX (también conocida como AF_LOCAL) se utiliza para comunicarse de manera eficiente entre procesos en la misma máquina. Tradicionalmente, los sockets de dominio UNIX pueden estar sin nombre o vinculados a un nombre de ruta del sistema de archivos (marcado como de tipo socket). Linux también admite un espacio de nombres abstracto que es independiente del sistema de archivos.

Es decir, no todos los sockets se pueden ver como un archivo (en el sentido de "sin archivo sin nombre de archivo").

Pero hay archivos con listas de sockets (por ejemplo /proc/net/tcp); Sin embargo, no es exactamente lo que significa "todo es un archivo".

Hauke ​​Laging
fuente
38

Un socket es un archivo. Pero no todos los archivos tienen nombres. Aquí hay algunos ejemplos de archivos que no tienen nombres:

  • Cualquier archivo que solía tener un nombre, y ahora se elimina, pero todavía lo abre un programa.
  • Una tubería sin nombre , como una creada por el |operador de shell.
  • La mayoría de los sockets : cualquier socket de Internet o un socket Unix que no esté en el espacio de nombres del sistema de archivos (puede estar en el espacio de nombres abstracto o sin nombre).

Los archivos como tuberías o tomas sin nombre son creados por un proceso y solo se puede acceder en ese proceso o en procesos secundarios creados posteriormente. (Esto no es completamente cierto: un proceso que tiene una tubería o socket (o cualquier otro archivo) abierto puede transmitirlo a otros procesos a través de un socket Unix; esto se conoce como paso de descriptor de archivo ).

Los sockets que tienen un nombre (ya sea en el sistema de archivos o resumen) se pueden abrir con ese nombre. Los enchufes de red pueden abrirse (o conectarse con mayor precisión) de forma remota desde cualquier máquina que tenga la conectividad adecuada.

Gilles 'SO- deja de ser malvado'
fuente
Esta es la respuesta correcta.
jforberg
44
/proc/<pid>/fd/*y /proc/net/*puede ser interesante
n611x007
Por favor acepte esta respuesta. Es en mi humilde opinión mucho más precisa.
user1202136
13

¿Qué y dónde está el archivo por cada socket?

"Todo" es una exageración. No es una política estricta, es solo una práctica común usar el sistema de archivos para las interfaces ya que el acceso al sistema de archivos es sinónimo de llamadas al sistema (es decir, el sistema de archivos es realmente una interfaz con el kernel, y por lo tanto proporciona un formato conveniente para todo tipo de cosas) . Otros sistemas operativos no hacen tanto uso de esto, por lo que se considera una característica distintiva.

Como menciona Hauke ​​Laging, los sockets "unix locales" tienen un nodo de archivo al igual que las canalizaciones con nombre (ver man fifo). Sin embargo, los zócalos de protocolo de Internet (utilizados para la comunicación de red) no lo hacen. En cambio, están asociados en el espacio de usuario con un número de puerto. Tenga en cuenta que un socket de servidor en un solo puerto conecta varios clientes, cada uno con su propio socket individual (también se puede usar un único archivo de socket local de Unix de esta manera con un servidor, lo que significa que puede haber múltiples sockets asociados con la misma dirección de archivo) y en el código, de hecho, se identifican individualmente a través de descriptores numéricos de archivo separados .

Entonces, en ese sentido, todos los sockets son muy parecidos a los archivos y tienen un enlace /proc/[pid]/fd/. Incluso puede llamar readlink()a este inodo y obtener un tipo especial de nombre de archivo, que se usa en herramientas de línea de comandos como lsof, creo; Del mismo modo, puede obtener información sobre el descriptor de socket a través de fstat().

encerrada dorada
fuente
¿Quieres decir "identificado en el espacio de usuario por su inodo"? No todos los sockets tienen un número de puerto y puede haber varios sockets para el mismo número de puerto (sin embargo, no tiene sentido).
Hauke ​​Laging
@HaukeLaging: buen punto. He editado para aclarar esto comenzando con el segundo párrafo.
Ricitos