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

gol*_*lem 23 linux path socket

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

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

Flo*_*elf 41

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

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

57.6 Linux 抽象套接字命名空间

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

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

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

显示一个引导null byte来表示这种类型的插座可能很困难,所以这可能是引导@标志的原因。

  • 值得注意的是,ASCII NUL 字符在许多终端中被输入为 ^@ ([Ctrl]+[@]),并且在被各种 Unix 命令(例如 GNU cat -a)显示时可以显示为 ^@。 (4认同)

Ven*_*atC 10

按照 man 7 unix

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

看起来这些是“抽象的”——所以文件系统上不存在真正的路径