Per quanto riguarda il perché, nwildner ha già scritto una risposta eccellente .
Qui mi concentrerò solo su come e il relativo utilizzo del percorso.
Internamente, mentre il file socket può anche essere cercato per nome (suppongo), di solito sono cercati per inode. In Linux, questa ricerca è assicurata dalla funzione unix_find_socket_byinode()
definita in net / unix / af_unix.c .
Questo può essere facilmente verificato come segue:
- Creare due directory A / e B / .
- Sotto ogni directory, fare in modo che un processo ascolti i file socket con lo stesso nome. Con
socat
te useresti un comando come:
$ socat UNIX-LISTEN:./my.sock -
- Ora scambia i file socket spostando A / my.sock su B / e viceversa.
- D'ora in poi, se l'applicazione client si connette a A / my.sock contatterà il server B e se si connette a B / my.sock contatterà il server A (tenere presente che al termine della comunicazione il processo del server potrebbe cancellare legittimamente quello che ritiene essere il proprio file socket).
Ho verificato questo comportamento su una manciata di sistemi Unix (Linux Debian, FreeBSD e OpenIndiana per ottenere un po 'di diversità), quindi questo comportamento sembra essere almeno diffuso, se non standard.
I percorsi assoluti vengono generalmente utilizzati come convenzione tra i processi client e server, poiché il processo client potrebbe non sapere altrimenti come stabilire la comunicazione iniziale con il server.
Tuttavia, se questa comunicazione iniziale non è un problema, sembra quindi sicuro utilizzare percorsi relativi per la creazione di file socket, consentendo di evitare problemi di lunghezza del percorso quando il percorso del file socket non è controllato direttamente dal processo del server.