У меня есть опыт использования локальных именованных и сетевых сокетов в C, но в Linux (Fedora 14) с помощью системного монитора GNOME я замечаю, что локальный сокет, используемый процессом init
, имеет путь "@/com/ubuntu/upstart"
. Одна вещь, которую я замечаю, это то, что этот путь (без '@') не существует, но я также понятия не имею, что означает '@'. Я не видел этого нигде больше.
Некоторые исследования говорят мне, что init
демон 'upstart' появился в Linux сравнительно недавно, предположительно, заменив другой старый демон. Он размещен на поддомене веб-сайта Ubuntu, поэтому я чувствую связь в этом смысле, но что означает '@'? И почему за ним следует несуществующий путь?
Спасибо
решение1
То, что вы видите, этоабстрактный сокет, особый вид сокета, специфичный для Linux. Отчеловек 7 unix:
* abstract: an abstract socket address is distinguished by the fact that
sun_path[0] is a null byte ('\0'). The socket's address in this namespace
is given by the additional bytes in sun_path that are covered by the
specified length of the address structure. (Null bytes in the name have no
special significance.) The name has no connection with file system
pathnames. When the address of an abstract socket is returned by
getsockname(2), getpeername(2), and accept(2), the returned addrlen is
greater than sizeof(sa_family_t) (i.e., greater than 2), and the name of
the socket is contained in the first (addrlen - sizeof(sa_family_t)) bytes
of sun_path. The abstract socket namespace is a nonportable Linux
extension.
Хотя это не указано, абстрактные имена сокетов выводятся с первым символом @ вместо нулевого байта, как это используется в bind() и т. д.
Как упоминается в man-странице, строка после @ или нулевого байта не является путем файловой системы и может быть чем угодно. В вашем случае она структурирована как путь по организационным причинам (чтобы избежать конфликтов с другими абстрактными сокетами).