Nos sistemas Unix, os nomes dos caminhos geralmente não têm praticamente nenhuma limitação de comprimento (bem, 4096 caracteres no Linux) ... exceto os caminhos dos arquivos de soquete, que são limitados a cerca de 100 caracteres (107 caracteres no Linux ).
- Primeira pergunta: por que uma limitação tão baixa?
Verifiquei que parece possível contornar essa limitação alterando o diretório de trabalho atual e criando em vários diretórios vários arquivos de soquete, todos usando o mesmo caminho ./myfile.sock
: os aplicativos clientes parecem se conectar corretamente aos processos esperados do servidor, embora lsof
mostre tudo deles ouvindo no mesmo caminho do arquivo de soquete.
- Esta solução alternativa é confiável ou tive apenas sorte?
- Esse comportamento é específico do Linux ou esta solução alternativa também pode ser aplicada a outros Unixes?
filenames
socket
limit
unix-sockets
WhiteWinterWolf
fonte
fonte
Respostas:
Compatibilidade com outras plataformas ou compatibilidade com coisas mais antigas para evitar excedentes ao usar
snprintf()
estrncpy()
.Michael Kerrisk explica em seu livro na página 1165 - Capítulo 57, Sockets: Domínio Unix:
Os caras do Docker até tiraram sarro disso, porque alguns soquetes tinham 110 caracteres:
É por isso que o LINUX usa um soquete de 108 caracteres. Isso pode ser alterado? Claro. E é por isso que, em primeiro lugar, essa limitação foi criada em sistemas operacionais mais antigos:
Citando a resposta:
Outros SOs (soquetes de domínio unix):
fonte
./my.socket
abaixo do diretórioA/
e outro arquivo de soquete também nomeado./my.socket
abaixo do diretórioB/
)?lsof
não faz nenhuma distinção entre os dois arquivos de soquete, no entanto, ainda parece funcionar, mas eu me pergunto se isso é apenas porque tenho sorte. Essa seria uma boa solução alternativa para criar arquivos de soquete abaixo de um caminho que já é maior que o tamanho permitido.lsof -U| grep amavis
(nova linha)amavis-se 2708 zimbra 17u unix 0xffff8806c0a95400 0t0 310330411 /opt/zimbra/data/tmp/amavisd-zmq.sock
/tmp
repleto de toneladas de diretórios não excluídos com nomes exclusivos cada contendo um único arquivo de soquete (totalmente feio, mas portátil e seguro).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:
socat
você usaria um comando como: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.
fonte