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

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

Спасибо

1 ответ1

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .