Cosa indica il simbolo @ all'inizio di un percorso socket del dominio unix in Linux?


17

Quando corro netstat --protocol unixo lsof -Uvedo che alcuni percorsi socket unix sono anteposti con il simbolo @, ad esempio @ / tmp / dbus-qj8V39Yrpa . Quindi quando corro ls -l /tmpnon vedo il file chiamato dbus-qj8V39Yrpa lì.

La domanda è: cosa indica quel simbolo anteposto @? E la seconda domanda correlata è: dove posso effettivamente trovare quel file socket unix ( @ / tmp / dbus-qj8V39Yrpa ) sul filesystem?


1
Per quello che vale, il ssprogramma più moderno mostra anche endpoint socket come "@ / tmp / .X11-unix / X0"
Bruce Ediger

Risposte:


33

La @probabilmente indica una presa tenuto in una abstract namespace, che non appartiene a un file nel filesystem.

Citando da The Linux Programming Interface di Michael Kerrisk :

57.6 The Linux Abstract Socket Namespace

Il cosiddetto spazio dei nomi astratto è una funzionalità specifica di Linux che ci consente di associare un socket di dominio UNIX a un nome senza che tale nome venga creato nel file system. Ciò offre alcuni potenziali vantaggi:

  • Non dobbiamo preoccuparci di possibili collisioni con nomi esistenti nel file system.
  • Non è necessario scollegare il percorso del socket dopo aver finito di utilizzare il socket. Il nome astratto viene rimosso automaticamente alla chiusura del socket.
  • Non è necessario creare un percorso del file system per il socket. Ciò può essere utile in un ambiente chroot o se non abbiamo accesso in scrittura a un file system.

Per creare un'associazione astratta, specifichiamo il primo byte del campo sun_path come byte null (\ 0). [...]

La visualizzazione di una derivazione null byteper indicare tale tipo di socket può essere difficile, quindi questa è forse la ragione del @segno principale .


2
È interessante notare che il carattere ASCUL NUL è inserito in molti terminali come ^ @ ([Ctrl] + [@]) e può apparire come ^ @ quando visualizzato da vari comandi Unix (come GNU cat -a).
Jim Dennis,

7

Come da man 7 unix

  • abstract: un indirizzo socket astratto si distingue per il fatto che sun_path [0] è un byte null ( \0). Tutti i byte rimanenti in sun_path definiscono il "nome" del socket. (I byte null nel nome non hanno alcun significato speciale.) Il nome non ha alcuna connessione con i nomi dei percorsi del file system. L'indirizzo del socket in questo spazio dei nomi è dato dal resto dei byte in sun_path. Quando l'indirizzo di un socket astratto viene restituito da getsockname (2), getpeername (2) e accetta (2), la sua lunghezza è sizeof (struct sockaddr_un) e sun_path contiene il nome astratto. Lo spazio dei nomi del socket astratto è un'estensione Linux non portatile.

Sembra che questi siano "astratti", quindi non è presente alcun percorso reale sul filesystem

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.