Wie kann ich eine UNIX-Domain-Socket-Datei löschen, wenn ich meine Anwendung beende?

Lesezeit: 3 Minuten

Benutzer-Avatar
Phoenix7

Ich habe eine Serveranwendung, die einen UNIX-Domänen-Socket in einem bestimmten Pfad mit einem Namen und erstellt bind()s dazu.

Ich muss den Socket nur löschen, wenn ich die Anwendung absichtlich innerhalb des Anwendungscodes schließe/stoppe; andernfalls muss es offen sein. Wie mache ich das?

Vielen Dank!

Bearbeiten: Bedenken Sie, dass ich meine Anwendung von einem Terminal aus starte und ausführe.

Du machst es dir schwerer, als es sein muss. Lege das unlink() kurz vor dem bind(). So machen es alle anderen. (Beispiel: BSD-syslogdeiner der klassischen Unix-Domain-Socket-basierten Dienste)

  • Danke. Ich dachte, ich müsste nach der Bindung gehen. danke für die Angabe, es musste vorher gehen.

    – Phoenix7

    19. Januar 2016 um 16:37 Uhr

  • Sie können beim Beenden immer noch die Verbindung aufheben, um zu verhindern, dass der veraltete Socket in Verzeichnislisten angezeigt wird, wenn der Server nicht läuft. Aber das ist reine Kosmetik.

    Benutzer2404501

    19. Januar 2016 um 16:53 Uhr

Wenn Sie mehrere Austrittspunkte aus Ihrer Anwendung haben und nicht jeden von ihnen ändern möchten, um die Bereinigungsroutine aufzurufen, können Sie einen “schmutzigen” Ansatz verwenden.

Wenn der Socket gerade erstellt wurde, registrieren Sie die Bereinigungsroutine mit atexit(3). Routine (was einfach ein Aufruf an unlink(2)) wird aufgerufen, wenn die Anwendung normal beendet wird. Aber es wird nicht aufgerufen, wenn die Anwendung mit einem Signal beendet wird. Wenn Sie also nach dem Empfang von SIGINT- und ähnlichen Signalen aufräumen möchten, müssen Sie auch Signal-Handler richtig einrichten.

  • ok, aber die Datei bleibt immer noch dort. Ich muss auch die Datei aus dem Ordner löschen

    – Phoenix7

    19. Januar 2016 um 10:13 Uhr

  • @Pheonix7, haben Sie den Exit-Code zum Aufheben der Verknüpfung auf Fehler überprüft?

    – gudok

    19. Januar 2016 um 10:23 Uhr

  • Wenn ich die Anwendung mit Strg + C verlasse, sagt das Terminal nichts. Wenn ich die Anwendung neu starte, erhalte ich einen Bindungsfehler: Adresse wird verwendet

    – Phoenix7

    19. Januar 2016 um 10:33 Uhr

Sie können überprüfen, ob der Socket aktiv ist, indem Sie nach /proc/net/unix schauen. Löschen Sie dann, entweder in einem Cron oder bevor Sie Ihre Anwendung starten / neu starten.

echo "active sockets in /path/"
cat /proc/net/unix | grep -Eo '/path/.*'

echo "all sockets in path including stale sockets"
ls -1F /path/ | egrep '=$' | sed 's/=$//'

echo "example command to remove stale sockets"
comm -1 -3 <(cat /proc/net/unix | grep -Eo '/path/.*' | sort)  <(ls -1F /path/ | egrep '=$' | sed 's/=$//' | sort) | xargs -n1 echo rm

Einfach ausführen

unlink("Path/to/Socket");

bevor Sie Ihr Programm beenden.

Sie können die Socket-Datei mit einem einfachen entfernen:

unlink(path);

Wo auch immer Sie programmieren, beenden Sie Ihr Programm, überprüfen Sie, ob es existiert, und entfernen Sie es.

  • aber ich beende meine Anwendung über das Terminal, wo würde ich also die Verknüpfung im Code aufheben?

    – Phoenix7

    19. Januar 2016 um 10:00 Uhr

  • Es spielt keine Rolle, wo Sie Ihre Anwendung beenden, es sei denn, Sie sagen, dass Sie treffen Control-C oder so. In diesem Fall müssen Sie vor dem Beenden einen Signalhandler erstellen, der sich um den Socket kümmert.

    – David Hölzer

    19. Januar 2016 um 10:07 Uhr

  • aber ich beende meine Anwendung über das Terminal, wo würde ich also die Verknüpfung im Code aufheben?

    – Phoenix7

    19. Januar 2016 um 10:00 Uhr

  • Es spielt keine Rolle, wo Sie Ihre Anwendung beenden, es sei denn, Sie sagen, dass Sie treffen Control-C oder so. In diesem Fall müssen Sie vor dem Beenden einen Signalhandler erstellen, der sich um den Socket kümmert.

    – David Hölzer

    19. Januar 2016 um 10:07 Uhr

1211170cookie-checkWie kann ich eine UNIX-Domain-Socket-Datei löschen, wenn ich meine Anwendung beende?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy