Sim, o Linux automaticamente "limpa" sockets abstratos na medida em que a limpeza até faz sentido. Aqui está um exemplo mínimo de trabalho com o qual você pode verificar isso:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
int
main(int argc, char **argv)
{
int s;
struct sockaddr_un sun;
if (argc != 2 || strlen(argv[1]) + 1 > sizeof(sun.sun_path)) {
fprintf(stderr, "usage: %s abstract-path\n", argv[0]);
exit(1);
}
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
perror("socket");
exit(1);
}
memset(&sun, 0, sizeof(sun));
sun.sun_family = AF_UNIX;
strcpy(sun.sun_path + 1, argv[1]);
if (bind(s, (struct sockaddr *) &sun, sizeof(sun))) {
perror("bind");
exit(1);
}
pause();
}
Execute este programa como ./a.out /test-socket &
, depois execute ss -ax | grep test-socket
e você verá o soquete em uso. Então, kill %./a.out
e ss -ax
mostrarão que o soquete desapareceu.
No entanto, o motivo pelo qual você não pode encontrar essa limpeza em qualquer documentação é que ela não está realmente sendo limpa, da mesma forma que os soquetes não-abstratos do domínio unix precisam ser limpos. Um soquete não abstrato realmente 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 parecido com um número de porta TCP ou UDP. Claro, se você ligar uma porta TCP e sair, essa porta TCP estará livre novamente. Mas o número de 16 bits que você usou ainda existe abstratamente e sempre o fez. O namespace dos números de porta é 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, que acabou de ser escolhido de um conjunto muito maior de números de portas possíveis que parecem ser nomes de caminho, mas não são. Você não pode ligar o mesmo número de porta duas vezes (com exceção de SO_REUSEADDR
ou SO_REUSEPORT
). Mas fechar o socket (explicitamente ou implicitamente por terminação) libera a porta, sem nada para limpar.