Was bedeutet das @ -Symbol am Anfang eines Unix-Domain-Socket-Pfads unter Linux?

17

Wenn ich laufe netstat --protocol unixoder lsof -Usehe, dass einigen Unix-Socket-Pfaden ein @ -Symbol vorangestellt ist, z. B. @ / tmp / dbus-qj8V39Yrpa . Wenn ich dann laufe, ls -l /tmpsehe ich dort keine Datei mit dem Namen dbus-qj8V39Yrpa .

Die Frage ist, was bedeutet das vorangestellte @ -Symbol? Die zweite verwandte Frage lautet: Wo finde ich die Unix-Socket-Datei ( @ / tmp / dbus-qj8V39Yrpa ) im Dateisystem?

Golem
quelle
1
Für das, was es wert ist, zeigt das modernere ssProgramm auch Socket-Endpunkte wie "@ / tmp / .X11-unix / X0"
Bruce Ediger

Antworten:

33

Das @weist wahrscheinlich auf einen Socket hin, der sich in einem befindet, abstract namespaceder nicht zu einer Datei im Dateisystem gehört.

Zitat aus der Linux-Programmierschnittstelle von Michael Kerrisk :

57.6 Der Linux Abstract Socket Namespace

Der sogenannte abstrakte Namespace ist eine Linux-spezifische Funktion, mit der wir einen UNIX-Domain-Socket an einen Namen binden können, ohne dass dieser Name im Dateisystem erstellt wird. Dies bietet einige potenzielle Vorteile:

  • Wir müssen uns keine Gedanken über mögliche Kollisionen mit vorhandenen Namen im Dateisystem machen.
  • Es ist nicht erforderlich, den Socket-Pfadnamen zu trennen, wenn der Socket nicht mehr verwendet wird. Der abstrakte Name wird automatisch entfernt, wenn der Socket geschlossen wird.
  • Wir müssen keinen Dateisystempfadnamen für den Socket erstellen. Dies kann in einer Chroot-Umgebung nützlich sein oder wenn wir keinen Schreibzugriff auf ein Dateisystem haben.

Um eine abstrakte Bindung zu erstellen, geben wir das erste Byte des sun_path- Felds als Nullbyte (\ 0) an. [...]

Das Anzeigen eines null byteführenden @Zeichens zur Bezeichnung eines solchen Sockeltyps kann schwierig sein, sodass dies möglicherweise der Grund für das führende Zeichen ist.

FloHimself
quelle
2
Es ist bemerkenswert, dass das ASCII-NUL-Zeichen in vielen Terminals als ^ @ ([Strg] + [@]) eingegeben wird und als ^ @ angezeigt werden kann, wenn es von verschiedenen Unix-Befehlen (wie GNU cat -a) angezeigt wird.
Jim Dennis
7

Wie pro man 7 unix

  • abstract: Eine abstrakte Socket-Adresse zeichnet sich dadurch aus, dass sun_path [0] ein Null-Byte ( \0) ist. Alle verbleibenden Bytes in sun_path definieren den "Namen" des Sockets. (Null-Bytes im Namen haben keine besondere Bedeutung.) Der Name hat keine Verbindung zu Pfadnamen des Dateisystems. Die Socket-Adresse in diesem Namespace wird durch die restlichen Bytes in sun_path angegeben. Wenn die Adresse eines abstrakten Sockets von getsockname (2), getpeername (2) und accept (2) zurückgegeben wird, hat sie die Länge sizeof (struct sockaddr_un) und sun_path enthält den abstrakten Namen. Der abstrakte Socket-Namespace ist eine nicht portable Linux-Erweiterung.

Sieht so aus, als wären diese "abstrakt" - es ist also kein realer Pfad im Dateisystem vorhanden

VenkatC
quelle