"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?
Respuestas:
man 7 unix:
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".fuente
Un socket es un archivo. Pero no todos los archivos tienen nombres. Aquí hay algunos ejemplos de archivos que no tienen nombres:
|
operador de shell.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.
fuente
/proc/<pid>/fd/*
y/proc/net/*
puede ser interesante"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 llamarreadlink()
a este inodo y obtener un tipo especial de nombre de archivo, que se usa en herramientas de línea de comandos comolsof
, creo; Del mismo modo, puede obtener información sobre el descriptor de socket a través defstat()
.fuente