Quanto ao porquê, o nwildner já escreveu uma excelente resposta .
Aqui, focarei apenas em como e no uso do caminho relativo.
Internamente, enquanto o arquivo de soquete também pode ser procurado por nome (eu acho), eles geralmente são procurados por inode. No Linux, essa pesquisa é garantida pela função unix_find_socket_byinode()
definida em net / unix / af_unix.c .
Isso pode ser facilmente verificado da seguinte forma:
- Crie dois diretórios A / e B / .
- Em cada diretório, faça um processo escutar nos arquivos de soquete com o mesmo nome. Com
socat
você usaria um comando como:
$ socat UNIX-LISTEN:./my.sock -
- Agora troque os arquivos de soquete movendo A / my.sock para B / e vice-versa.
- A partir de agora, se o aplicativo cliente se conectar ao A / my.sock, ele entrará em contato com o servidor B e, se ele se conectar ao B / my.sock , entrará em contato com o servidor A (observe que, quando a comunicação terminar, o processo do servidor poderá legitimamente exclua o que considera ser seu próprio arquivo de soquete).
Eu verifiquei esse comportamento em vários sistemas Unix (Linux Debian, FreeBSD e OpenIndiana para obter alguma diversidade), então esse comportamento parece ser pelo menos amplo, se não padrão.
Os caminhos absolutos geralmente são usados como uma convenção entre os processos do cliente e do servidor, pois o processo do cliente pode não saber como estabelecer a comunicação inicial com o servidor.
No entanto, se essa comunicação inicial não for um problema, parece seguro usar caminhos relativos para a criação de arquivos de soquete, permitindo evitar problemas de comprimento de caminho quando o local do arquivo de soquete não for diretamente controlado pelo processo do servidor.