Linux 使用“@”初始化本地套接字

Linux 使用“@”初始化本地套接字

我有在 C 中使用本地命名和網路套接字的經驗,但在 Linux (Fedora 14) 上,使用 GNOME 系統監視器,我注意到進程使用的本地套接字init具有路徑"@/com/ubuntu/upstart"。我注意到的一件事是這條路徑(沒有“@”)不存在,而且我也不知道“@”是什麼意思。我在其他地方沒有看到過這個。

有些研究告訴我,init「upstart」守護程式是 Linux 中最近才引進的,可能會取代另一個較舊的守護程式。它託管在 Ubuntu 網站的子網域上,因此我感覺到了這種意義上的連接,但是「@」意味著什麼?為什麼它後面會出現一條不存在的路徑?

謝謝

答案1

你看到的是一個抽象套接字,一種特定於 Linux 的特殊套接字。從人 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.

雖然沒有提到這一點,但抽象套接字名稱列印時使用第一個字元@而不是空字節,如在bind()等中使用的那樣。

正如手冊頁中提到的,@ 或空字節後面的字串不是檔案系統路徑,可以是任何內容。在您的情況下,出於組織原因,它被構造為路徑(以避免與其他抽象套接字發生衝突)。

相關內容