En los sistemas Unix, los nombres de ruta generalmente no tienen limitación de longitud (bueno, 4096 caracteres en Linux) ... excepto las rutas de archivos de socket que están limitadas a alrededor de 100 caracteres (107 caracteres en Linux ).
- Primera pregunta: ¿por qué una limitación tan baja?
He comprobado que parece posible solucionar esta limitación cambiando el directorio de trabajo actual y creando en varios directorios varios archivos de socket, todos con la misma ruta ./myfile.sock
: las aplicaciones cliente parecen conectarse correctamente a los procesos esperados del servidor, aunque lsof
muestra todo de ellos escuchando en la misma ruta del archivo socket.
- ¿Es confiable esta solución o simplemente tuve suerte?
- ¿Es este comportamiento específico de Linux o esta solución puede aplicarse también a otros Unixes?
filenames
socket
limit
unix-sockets
WhiteWinterWolf
fuente
fuente
Respuestas:
Compatibilidad con otras plataformas, o compatibilidad con cosas más antiguas para evitar desbordamientos al usar
snprintf()
ystrncpy()
.Michael Kerrisk explica en su libro en la página 1165 - Capítulo 57, Sockets: dominio Unix:
Los chicos de Docker incluso se burlaron de él, porque algunos sockets tenían 110 caracteres de longitud:
Es por eso que LINUX usa un zócalo de 108 caracteres. ¿Podría esto ser cambiado? Por supuesto. Y esta es la razón por la cual, en primer lugar, esta limitación se creó en sistemas operativos más antiguos:
Citando la respuesta:
Otros sistemas operativos (sockets de dominio unix):
fuente
./my.socket
directorio debajoA/
y otro archivo de socket también llamado./my.socket
directorio debajoB/
)?lsof
no hace ninguna distinción entre los dos archivos de socket, sin embargo, todavía parece funcionar, pero me pregunto si esto es solo porque tengo suerte. Esta sería una buena solución para crear archivos de socket debajo de una ruta que ya es más larga que el tamaño permitido.lsof -U| grep amavis
(nueva línea)amavis-se 2708 zimbra 17u unix 0xffff8806c0a95400 0t0 310330411 /opt/zimbra/data/tmp/amavisd-zmq.sock
/tmp
con toneladas de directorios no eliminados con nombres únicos cada uno que contiene un archivo de socket único (completamente feo, pero portátil y seguro).En cuanto al por qué, nwildner ya escribió una excelente respuesta .
Aquí solo me enfocaré en el cómo y el uso relativo de la ruta.
Internamente, aunque el archivo de socket también se puede buscar por nombre (supongo), generalmente se buscan por inodo. En Linux, esta búsqueda está garantizada por la función
unix_find_socket_byinode()
definida en net / unix / af_unix.c .Esto se puede verificar fácilmente de la siguiente manera:
socat
usted usaría un comando como:Verifiqué este comportamiento en un puñado de sistemas Unix (Linux Debian, FreeBSD y OpenIndiana para obtener cierta diversidad), por lo que este comportamiento parece ser al menos generalizado, si no estándar.
Las rutas absolutas generalmente se utilizan como una convención entre los procesos del cliente y el servidor, ya que el proceso del cliente no sabe de otra manera cómo establecer la comunicación inicial con el servidor.
Sin embargo, si esta comunicación inicial no es un problema, parece seguro usar rutas relativas para la creación de archivos de socket, lo que permite evitar problemas de longitud de ruta cuando la ubicación del archivo de socket no está directamente controlada por el proceso del servidor.
fuente