私は C でローカルの名前付きソケットとネットワーク ソケットを使用した経験がありますが、Linux (Fedora 14) で GNOME システム モニターを使用すると、プロセスによって使用されているローカル ソケットにinit
パスがあることに気付きました"@/com/ubuntu/upstart"
。私が気付いたことの 1 つは、このパス ('@' なし) が存在しないことですが、'@' が何を意味するのかわかりません。私は他のどこでもこれを見たことがありません。
調査によると、init
「upstart」デーモンは Linux に比較的最近導入されたもので、おそらく別の古いデーモンを置き換えたものだそうです。これは Ubuntu Web サイトのサブドメインでホストされているので、その意味では関連性を感じますが、「@」は何を意味しているのでしょうか。また、存在しないパスがそれに続くのはなぜでしょうか。
ありがとう
答え1
あなたが見ているのは抽象ソケット、Linux特有の特殊なソケットです。男7ユニックス:
* 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() などで使用されるヌルバイトではなく、最初の文字 @ で印刷されます。
マニュアル ページに記載されているように、@ または null バイトの後の文字列はファイル システム パスではなく、任意のものになります。この場合、組織上の理由からパスとして構造化されています (他の抽象ソケットとの競合を避けるため)。