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() 等中使用的那样。

正如手册页中提到的,@ 或空字节后面的字符串不是文件系统路径,可以是任何内容。 在您的例子中,出于组织原因(为了避免与其他抽象套接字冲突),它被构造为路径。

相关内容