Что символ @ обозначает в начале пути к сокету домена unix в Linux?

17

Когда я запускаю netstat --protocol unixили lsof -Uвижу, что некоторые пути к сокетам Unix начинаются с символа @, например, @ / tmp / dbus-qj8V39Yrpa . Затем, когда я запускаю, ls -l /tmpя не вижу файл с именем dbus-qj8V39Yrpa там.

Вопрос в том, что означает этот префиксный символ @? И второй связанный с этим вопрос: где я могу найти этот файл сокета unix ( @ / tmp / dbus-qj8V39Yrpa ) в файловой системе?

голем
источник
1
Что бы это ни стоило, более современная ssпрограмма также показывает конечные точки сокетов, такие как "@ / tmp / .X11-unix / X0"
Брюс Эдигер

Ответы:

33

@, Вероятно , указывает на сокет удерживается в abstract namespaceкотором не принадлежит к файлу в файловой системе.

Цитируя The Linux Programming Interface по Майкл Керриск :

57.6 Пространство имен абстрактных сокетов Linux

Так называемое абстрактное пространство имен - это специфическая для Linux функция, которая позволяет нам привязать сокет домена UNIX к имени без создания этого имени в файловой системе. Это обеспечивает несколько потенциальных преимуществ:

  • Нам не нужно беспокоиться о возможных конфликтах с существующими именами в файловой системе.
  • Нет необходимости отсоединять путь к сокету, когда мы закончили использовать сокет. Абстрактное имя автоматически удаляется при закрытии сокета.
  • Нам не нужно создавать путь к файловой системе для сокета. Это может быть полезно в среде chroot или если у нас нет прав на запись в файловую систему.

Чтобы создать абстрактную привязку, мы указываем первый байт поля sun_path как нулевой байт (\ 0). [...]

Отображение ведущего null byteдля обозначения такого типа сокета может быть затруднено, поэтому это может быть причиной для ведущего @знака.

FloHimself
источник
2
Следует отметить, что символ ASCII NUL вводится во многих терминалах как ^ @ ([Ctrl] + [@]) и может отображаться как ^ @ при отображении различными командами Unix (такими как GNU cat -a).
Джим Деннис
7

Согласно man 7 unix

  • абстрактный: абстрактный адрес сокета отличается тем, что sun_path [0] является нулевым байтом ( \0). Все остальные байты в sun_path определяют «имя» сокета. (Нулевые байты в имени не имеют особого значения.) Имя не связано с путями в файловой системе. Адрес сокета в этом пространстве имен задается остальными байтами в sun_path. Когда адрес абстрактного сокета возвращается с помощью getsockname (2), getpeername (2) и accept (2), его длина равна sizeof (struct sockaddr_un), а sun_path содержит абстрактное имя. Пространство имен абстрактного сокета является непереносимым расширением Linux.

Похоже, они «абстрактные», поэтому в файловой системе нет реального пути

VenkatC
источник