Co symbol @ oznacza na początku ścieżki gniazda domeny unix w Linuksie?

17

Kiedy uruchamiam netstat --protocol unixlub lsof -Uwidzę, że niektóre ścieżki gniazd unix są poprzedzone symbolem @, na przykład @ / tmp / dbus-qj8V39Yrpa . Następnie po uruchomieniu ls -l /tmpnie widzę tam pliku o nazwie dbus-qj8V39Yrpa .

Pytanie brzmi: co oznacza ten poprzedzony symbol @? Drugim powiązanym pytaniem jest - gdzie właściwie mogę znaleźć ten plik gniazda UNIX ( @ / tmp / dbus-qj8V39Yrpa ) w systemie plików?

golem
źródło
1
Co jest warte tego, bardziej nowoczesny ssprogram pokazuje również punkty końcowe gniazd, takie jak „@ / tmp / .X11-unix / X0”
Bruce Ediger

Odpowiedzi:

33

@Prawdopodobnie wskazuje gniazdo utrzymywany w abstract namespacektóre nie należą do pliku w systemie plików.

Cytat z interfejsu programistycznego Linuksa autorstwa Michaela Kerriska :

57.6 Przestrzeń nazw Linux Abstract Socket

Tak zwana abstrakcyjna przestrzeń nazw to funkcja specyficzna dla systemu Linux, która pozwala nam powiązać gniazdo domeny UNIX z nazwą bez tworzenia tej nazwy w systemie plików. Zapewnia to kilka potencjalnych korzyści:

  • Nie musimy się martwić o możliwe kolizje z istniejącymi nazwami w systemie plików.
  • Odłączenie nazwy ścieżki gniazda nie jest konieczne, gdy zakończymy korzystanie z gniazda. Nazwa abstrakcyjna jest automatycznie usuwana po zamknięciu gniazda.
  • Nie musimy tworzyć ścieżki do systemu plików dla gniazda. Może to być przydatne w środowisku chroot lub jeśli nie mamy dostępu do zapisu w systemie plików.

Aby utworzyć powiązanie abstrakcyjne, określamy pierwszy bajt pola sun_path jako bajt zerowy (\ 0). [...]

Wyświetlenie wiodącego null byteoznaczenia takiego typu gniazda może być trudne, więc może to jest powód, dla którego wiodący @znak jest.

FloHimself
źródło
2
Warto zauważyć, że znak ASCII NUL jest wprowadzany do wielu terminali jako ^ @ ([Ctrl] + [@]) i może pojawiać się jako ^ @, gdy jest wyświetlany przez różne polecenia uniksowe (takie jak GNU cat -a).
Jim Dennis,
7

Zgodnie z man 7 unix

  • abstract: abstrakcyjny adres gniazda wyróżnia się tym, że sun_path [0] jest pustym bajtem ( \0). Wszystkie pozostałe bajty w ścieżce sun_path określają „nazwę” gniazda. (Puste bajty w nazwie nie mają specjalnego znaczenia.) Nazwa nie ma związku z nazwami ścieżek systemu plików. Adres gniazda w tej przestrzeni nazw jest podawany przez pozostałe bajty w ścieżce sun_path. Kiedy adres gniazda abstrakcyjnego jest zwracany przez getsockname (2), getpeername (2) i accept (2), jego długość to sizeof (struct sockaddr_un), a ścieżka_ś Sun zawiera nazwę abstrakcyjną. Abstrakcyjna przestrzeń nazw gniazd jest nieprzenośnym rozszerzeniem Linuksa.

Wygląda na to, że są „abstrakcyjne” - więc w systemie plików nie ma prawdziwej ścieżki

VenkatC
źródło