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

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

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

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

答案1

可能表示不属于文件系统中的文件@的套接字。abstract namespace

引用自Linux 编程接口经过迈克尔·克里克:

57.6 Linux 抽象套接字命名空间

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

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

要创建抽象绑定,我们指定第一个字节 太阳路径字段为空字节 (\0)。 [...]

显示前导null byte来表示这种类型的套接字可能很困难,因此这可能是前导符号的原因@

答案2

按照man 7 unix

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

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

相关内容