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:
- Cree dos directorios A / y B / .
- Debajo de cada directorio, haga que un proceso escuche en archivos de socket con el mismo nombre. Con
socat
usted usaría un comando como:
$ socat UNIX-LISTEN:./my.sock -
- Ahora intercambie los archivos del socket moviendo A / my.sock a B / y viceversa.
- De ahora en adelante, si la aplicación del cliente se conecta a A / my.sock, se pondrá en contacto con el servidor B , y si se conecta a B / my.sock, se pondrá en contacto con el servidor A (tenga en cuenta que cuando finalice la comunicación, el proceso del servidor puede elimina legítimamente lo que cree que es su propio archivo de socket).
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.