Tak, linux automatycznie „czyści” abstrakcyjne gniazda do tego stopnia, że nawet czyszczenie ma sens. Oto minimalny działający przykład, za pomocą którego możesz to zweryfikować:
#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();
}
Uruchom ten program jako ./a.out /test-socket &
, a następnie uruchom ss -ax | grep test-socket
, a zobaczysz używane gniazdo. Wtedy kill %./a.out
, i ss -ax
pokaże gniazdko nie ma.
Jednak powodem, dla którego nie można znaleźć takiego czyszczenia w żadnej dokumentacji, jest to, że tak naprawdę nie jest to czyszczenie w tym samym sensie, co nie abstrakcyjne gniazda w domenie unixowej wymagają czyszczenia. Nie-abstrakcyjne gniazdo faktycznie przydziela i-węzeł i tworzy wpis w katalogu, który należy wyczyścić w podstawowym systemie plików. Pomyśl o abstrakcyjnym gnieździe bardziej przypominającym numer portu TCP lub UDP. Jasne, jeśli powiążesz port TCP, a następnie wyjdziesz, ten port TCP znów będzie wolny. Ale jakikolwiek numer 16-bitowy, którego użyłeś, nadal istnieje abstrakcyjnie i zawsze istniał. Przestrzeń nazw numerów portów to 1-65535 i nigdy się nie zmienia ani nie wymaga czyszczenia.
Pomyśl więc o abstrakcyjnej nazwie gniazda, takiej jak numer portu TCP lub UDP, wybrany z dużo większego zestawu możliwych numerów portów, które wyglądają jak nazwy ścieżek, ale nimi nie są. Nie można powiązać tego samego numeru portu dwa razy (blokowanie SO_REUSEADDR
lub SO_REUSEPORT
). Ale zamknięcie gniazda (jawnie lub niejawnie przez zakończenie) uwalnia port, nie pozostawiając nic do wyczyszczenia.