Linux socket local de inicialização com '@'

0
Tenho experiência com o uso de sockets de rede e nomes locais em C, mas no Linux (Fedora 14), usando o monitor do sistema GNOME, noto que um socket local, sendo usado pelo processo init , tem o caminho "@/com/ubuntu/upstart" . Uma coisa que noto é que esse caminho (sem o '@') não existe, mas também não tenho ideia do que significa '@'. Eu não vi isso em nenhum outro lugar.

Algumas pesquisas me dizem que o daemon init 'upstart' é uma introdução bastante recente ao Linux, presumivelmente substituindo outro daemon antigo. Ele está hospedado em um subdomínio do site do Ubuntu, então eu sinto uma conexão nesse sentido, mas o que o '@' significa? E por que um caminho inexistente o segue?

Obrigado

    
por Doddy 23.01.2012 / 01:00

1 resposta

1

O que você está vendo é um abstract socket , um tipo especial de soquete específico para o Linux. De man 7 unix :

   *  abstract: an abstract socket address is distinguished by the fact that
      sun_path[0] is a null byte ('
   *  abstract: an abstract socket address is distinguished by the fact that
      sun_path[0] is a null byte ('%pre%').  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.
'). 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.

Embora isso não seja mencionado, os nomes de soquete abstratos são impressos com o primeiro caractere @ em vez do byte nulo, como é usado em bind () etc.

Como é mencionado na man page, a string após o @ ou o byte nulo não é um caminho do sistema de arquivos, e pode ser qualquer coisa. No seu caso, ele é estruturado como um caminho por motivos organizacionais (para evitar conflitos com outros sockets abstratos).

    
por 23.01.2012 / 01:10