在Linux中,unix域套接字路径开头的@符号表示什么?


17

当我运行时,netstat --protocol unixlsof -U看到某些unix套接字路径前面带有@符号,例如@ / tmp / dbus-qj8V39Yrpa。然后,当我运行时,我在ls -l /tmp那里看不到名为dbus-qj8V39Yrpa的文件。

问题是,@符号前面表示什么?第二个相关的问题是-我实际上在文件系统上哪里可以找到该unix套接字文件(@ / tmp / dbus-qj8V39Yrpa)?


1
就其价值而言,更现代的ss程序还显示了套接字端点,例如“ @ / tmp / .X11-unix / X0”
Bruce Ediger

Answers:


33

@可能表明在召开的插座abstract namespace,其不属于文件系统中的文件。

从报价Linux的编程接口迈克尔·凯里斯克

57.6 Linux抽象套接字命名空间

所谓的抽象名称空间是一种特定于Linux的功能,它使我们能够将UNIX域套接字绑定到一个名称,而无需在文件系统中创建该名称。这提供了一些潜在的优势:

  • 我们无需担心与文件系统中现有名称可能发生冲突。
  • 使用完套接字后,不必取消链接套接字路径名的操作。关闭套接字后,抽象名称将自动删除。
  • 我们不需要为套接字创建文件系统路径名。在chroot环境中,或者如果我们没有文件系统的写访问权,这可能很有用。

要创建抽象绑定,我们将sun_path字段的第一个字节指定 为空字节(\ 0)。[...]

显示引线null byte以表示这种类型的插座可能很困难,因此这可能是引线@符号的原因。


2
值得注意的是,ASCII NUL字符在许多终端中以^ @([Ctrl] + [@])的形式输入,当通过各种Unix命令(例如GNU cat -a)显示时,它可以显示为^ @。
吉姆·丹尼斯

7

按照 man 7 unix

  • abstract:抽象套接字地址的特征在于sun_path [0]是一个空字节(\0)。sun_path中的所有剩余字节均定义套接字的“名称”。(名称中的空字节没有特殊意义。)该名称与文件系统路径名没有任何关系。该名称空间中套接字的地址由sun_path中的其余字节给出。由getsockname(2),getpeername(2)和accept(2)返回抽象套接字的地址时,其长度为sizeof(struct sockaddr_un),而sun_path包含抽象名称。抽象套接字名称空间是不可移植的Linux扩展。

看起来这些是“抽象的”-因此文件系统上没有实际路径

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.