Ja, Linux "räumt" abstrakte Sockets automatisch auf, sofern das Aufräumen überhaupt Sinn macht. Hier ist ein minimales Arbeitsbeispiel, anhand dessen Sie dies überprüfen können:
#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();
}
Führen Sie dieses Programm als ./a.out /test-socket &
aus ss -ax | grep test-socket
, und führen Sie dann aus , und Sie werden den verwendeten Socket sehen. Dann kill %./a.out
wird und ss -ax
zeigen, dass die Steckdose weg ist.
Der Grund, warum Sie diese Bereinigung in keiner Dokumentation finden können, ist, dass sie nicht wirklich in dem Sinne bereinigt werden kann, in dem nicht abstrakte Sockets für Unix-Domänen bereinigt werden müssen. Ein nicht-abstrakter Socket weist tatsächlich einen Inode zu und erstellt einen Eintrag in einem Verzeichnis, der im zugrunde liegenden Dateisystem bereinigt werden muss. Stellen Sie sich einen abstrakten Socket dagegen eher wie eine TCP- oder UDP-Portnummer vor. Sicher, wenn Sie einen TCP-Port binden und dann beenden, ist dieser TCP-Port wieder frei. Aber welche 16-Bit-Zahl Sie auch immer verwendet haben, sie existiert immer noch abstrakt und hat es immer getan. Der Namespace der Portnummern ist 1-65535 und muss niemals geändert oder gereinigt werden.
Stellen Sie sich also den abstrakten Socket-Namen wie eine TCP- oder UDP-Portnummer vor, die Sie aus einem viel größeren Satz möglicher Portnummern ausgewählt haben, die zwar wie Pfadnamen aussehen, dies aber nicht sind. Sie können dieselbe Portnummer nicht zweimal binden (außer SO_REUSEADDR
oder SO_REUSEPORT
). Durch Schließen des Sockets (explizit oder implizit durch Beenden) wird der Port jedoch freigegeben, und es muss nichts mehr aufgeräumt werden.