Tenho experiência com uso de soquetes locais nomeados e de rede em C, mas no Linux (Fedora 14), utilizando o monitor do sistema GNOME, noto que um soquete local, sendo utilizado pelo init
processo, possui 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 o '@'. Eu não vi isso em nenhum outro lugar.
Algumas pesquisas me dizem que o init
daemon 'inicial' é uma introdução bastante recente ao Linux, presumivelmente substituindo outro daemon mais antigo. Ele está hospedado em um subdomínio do site do Ubuntu, então sinto uma conexão nesse sentido, mas o que significa o '@'? E por que um caminho inexistente o segue?
Obrigado
Responder1
O que você está vendo é umsoquete abstrato, um tipo especial de soquete específico para Linux. Dehomem 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.
Embora isso não seja mencionado, nomes de soquetes abstratos são impressos com o primeiro caractere @ em vez do byte nulo, como é usado em bind() etc.
Como é mencionado na página de manual, 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 está estruturado como um caminho por motivos organizacionais (para evitar conflitos com outros soquetes abstratos).