Linux-Init-Local-Socket mit '@'

550
Doddy

Ich habe Erfahrung mit der Verwendung von lokalen Named- und Netzwerk-Sockets in C, aber unter Linux (Fedora 14) und dem GNOME-Systemmonitor stelle ich fest, dass ein lokaler Socket, der vom initProzess verwendet wird, den Pfad hat "@/com/ubuntu/upstart". Ich stelle fest, dass dieser Pfad (ohne das '@') nicht existiert, aber ich habe auch keine Ahnung, was das '@' bedeutet. Ich habe das nirgendwo anders gesehen.

Einige Nachforschungen zeigen, dass der initDämon 'upstart' eine relativ neue Einführung in Linux ist und vermutlich einen anderen älteren Dämon ersetzt. Es wird auf einer Subdomain der Ubuntu-Website gehostet, daher spüre ich eine Verbindung in diesem Sinne, aber was bedeutet das "@"? Und warum folgt ein nicht existierender Pfad?

Vielen Dank

0

1 Antwort auf die Frage

1
Ambroz Bizjak

Was Sie sehen, ist ein abstrakter Sockel, eine spezielle Art von Linux-spezifischem Sockel. Von Mann 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. 

Während dies nicht erwähnt wird, werden abstrakte Socket-Namen mit dem ersten Zeichen @ anstelle des Null-Bytes gedruckt, wie in bind () usw. verwendet.

Wie in der Manpage erwähnt, ist die Zeichenfolge nach dem @ oder dem Null-Byte kein Dateisystempfad und kann alles sein. In Ihrem Fall ist der Pfad aus organisatorischen Gründen strukturiert (um Konflikte mit anderen abstrakten Sockets zu vermeiden).

Kein Zufall, '@' ist das Zeichen, das das NULL-Byte darstellt, wenn Sie dieselbe Übersetzung vornehmen, die Sie '^ A' als SOH erhält, Steuerzeichen eins. Daniel Pittman vor 12 Jahren 0