
Tengo experiencia con el uso de sockets de red y con nombre local en C, pero en Linux (Fedora 14), usando el monitor del sistema GNOME, noto que un socket local, utilizado por el init
proceso, tiene la ruta "@/com/ubuntu/upstart"
. Una cosa que noto es que esta ruta (sin '@') no existe, pero tampoco tengo idea de qué significa '@'. No he visto esto en ningún otro lugar.
Algunas investigaciones me dicen que el init
demonio 'advenedizo' es una introducción bastante reciente a Linux, presumiblemente reemplazando a otro demonio más antiguo. Está alojado en un subdominio del sitio web de Ubuntu, por lo que siento una conexión en ese sentido, pero ¿qué significa la '@'? ¿Y por qué lo sigue un camino inexistente?
Gracias
Respuesta1
Lo que estás viendo es unenchufe abstracto, un tipo especial de socket específico de Linux. Dehombre 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.
Si bien esto no se menciona, los nombres de sockets abstractos se imprimen con el primer carácter @ en lugar del byte nulo, como se usa en bind(), etc.
Como se menciona en la página de manual, la cadena después de @ o el byte nulo no es una ruta del sistema de archivos y puede ser cualquier cosa. En su caso, está estructurado como una ruta por motivos organizativos (para evitar conflictos con otros sockets abstractos).