Linux init локальный сокет с '@'

478
Doddy

У меня есть опыт использования локальных именованных и сетевых сокетов в C, но в Linux (Fedora 14), используя системный монитор GNOME, я замечаю, что локальный сокет, используемый initпроцессом, имеет путь "@/com/ubuntu/upstart". Я заметил, что этот путь (без «@») не существует, но я также не знаю, что означает «@». Я не видел этого нигде.

Некоторые исследования говорят мне, что initдемон upstart - это довольно недавнее введение в Linux, предположительно заменяющее другого более старого демона. Он размещен на поддомене сайта Ubuntu, поэтому я чувствую связь в этом смысле, но что означает «@»? И почему по нему следует несуществующий путь?

Спасибо

0

1 ответ на вопрос

1
Ambroz Bizjak

То, что вы видите, это абстрактный сокет, особый вид сокета, специфичный для Linux. Из man 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 () и т. Д.

Как упомянуто на странице руководства, строка после байта @ или пустого байта не является путем к файловой системе и может быть чем угодно. В вашем случае он структурирован как путь по организационным причинам (чтобы избежать конфликтов с другими абстрактными сокетами).

Не случайно, «@» - это символ, представляющий байт NULL, когда вы делаете тот же перевод, который получает «^ A», как SOH, управляющий символ один. Daniel Pittman 12 лет назад 0

Похожие вопросы