Há uma ótima resposta no StackOverflow sobre o fornecimento de um bloqueio melhor para daemons (sintetizado a partir de Eduardo Fleury ) que não depende do mecanismo de bloqueio de arquivo PID comum para daemons. Existem muitos comentários bons sobre por que os arquivos de bloqueio PID às vezes podem causar problemas, por isso não os refiz aqui.
Em resumo, a solução conta com soquetes de domínio de espaço para nome abstrato do Linux, que rastreia os soquetes por nome para você, em vez de depender de arquivos, que podem permanecer depois que o daemon é SIGKILL. O exemplo mostra que o Linux parece liberar o soquete assim que o processo termina.
Mas não consigo encontrar documentação definitiva no Linux que diga o que exatamente o Linux faz com o soquete abstrato quando o processo vinculado é SIGKILL'd. Alguém sabe?
Em outras palavras, quando exatamente o soquete abstrato é liberado para ser usado novamente?
Não quero substituir o mecanismo de arquivo PID por soquetes abstratos, a menos que resolva definitivamente o problema.
fonte
Respostas:
Sim, o linux "limpa" automaticamente os soquetes abstratos na medida em que a limpeza faz sentido. Aqui está um exemplo de trabalho mínimo com o qual você pode verificar isso:
Execute este programa como
./a.out /test-socket &
, em seguida, executess -ax | grep test-socket
e você verá o soquete em uso. Entãokill %./a.out
, ess -ax
mostrará que o soquete se foi.No entanto, o motivo pelo qual você não consegue encontrar essa limpeza em nenhuma documentação é que ela não está realmente limpando no mesmo sentido que soquetes de domínio unix não abstratos precisam ser limpos. Na verdade, um soquete não abstrato aloca um inode e cria uma entrada em um diretório, que precisa ser limpo no sistema de arquivos subjacente. Por outro lado, pense em um soquete abstrato mais como um número de porta TCP ou UDP. Claro, se você ligar uma porta TCP e depois sair, essa porta TCP estará livre novamente. Mas qualquer número de 16 bits que você usou ainda existe abstratamente e sempre existiu. O espaço para nome dos números das portas é 1-65535 e nunca muda ou precisa de limpeza.
Portanto, pense no nome do soquete abstrato como um número de porta TCP ou UDP, apenas escolhido em um conjunto muito maior de números de porta possíveis que parecem com nomes de caminho, mas não são. Você não pode vincular o mesmo número de porta duas vezes (barramento
SO_REUSEADDR
ouSO_REUSEPORT
). Mas fechar o soquete (explícita ou implicitamente ao finalizar) libera a porta, sem mais nada para limpar.fonte
Publiquei essa pergunta há mais de um ano e nunca fiquei bastante satisfeito com a falta de documentação definitiva. Eu pensei em verificar a documentação do Linux novamente para obter quaisquer atualizações e fiquei feliz em ver isso :
Além disso, a Interface de Programação do Linux, de Michael Kerrisk, cobre a pergunta (postada nesta outra resposta ):
Acho que, junto com a resposta de @ user3188445, isso esclarece a questão com muita precisão.
Dito isto, ainda existe uma suposição feita aqui, de que os processos que são da SIGKILL terão todos os soquetes abertos fechados. Parece uma suposição razoável, mas não tenho documentação que defina esse comportamento.
fonte
SOCK_CLOEXEC
, caso algum código (incluindo uma biblioteca) faça fork () + exec (). Criar processos filhos extras usando fork () sem exec () é menos comum; você provavelmente já sabe se está fazendo isso.