Linux的unix(7)手册把AF_UNIX,也称AF_LOCAL,介绍为同一机器上进程之间的通信家族。它随后列出流、数据报和顺序分组等通信类型,又在地址格式中区分路径名、无名和抽象地址。两组分类回答不同问题:前者说明通信对象采用哪一类语义,后者说明一个端点怎样具名。不能因为某种通信类型叫作流,就替它补出一个文件路径。[1]

通信类型本身也有区别。手册将SOCK_STREAM称为面向流;SOCK_DGRAM保留消息边界;SOCK_SEQPACKET既面向连接,也保留消息边界并按发送顺序交付。地址的三种名称没有取代这些区别。同一个资料摘要若只留下“本地通信”,便既省略了消息如何组织,也省略了端点名称如何表达,读者无法仅凭这四个字还原原来的两层说明。[1]

地址结构中的sun_family字段标识AF_UNIX,sun_path则是另一字段。尽管后者名字含有path,手册并没有把所有地址都解释成文件系统路径。路径名地址才明确使用以空字节终止的文件系统路径;在这一语境里,空字节承担的是字符串结束位置的作用。文件路径作为名字出现,与地址结构里恰好存在一个叫sun_path的区域,并不是同一个条件。[1]

无名地址进一步说明这个字段名不能独自决定内容。手册举出没有绑定路径名的流套接字,以及socketpair产生的两个端点,说明它们可以没有名字。此时返回地址只包含家族部分,原文明确说不应检查sun_path。因此,“没有路径名”不是“应该从路径区再找一个隐藏文件名”;这类返回资料本来就没有提供可按路径读取的名字。[1]

抽象地址使用同一结构,却以sun_path的首个字节为空字节来区别路径名地址。它的名字由后续、落在指定地址长度范围内的字节给出,而不是沿用路径字符串遇到空字节便结束的解释。手册特别补充,名字内部的空字节没有特殊意义。开头的空字节识别命名空间,内部的空字节属于名字内容,两处虽然是同一种字节值,作用却由所在位置和地址规则决定。[1]

这个区别也让“字符串没有可见开头”不再等于“端点无名”。无名地址没有可供读取的路径区名字;抽象地址则有按地址长度覆盖范围表达的名字,只是它与文件系统路径没有联系。判断一份地址说明采用哪套规则,需要先保留手册给出的地址类别,再解释字段内容,不能单靠名字能否打印成通常的路径来替三类地址分类。[1]

抽象地址还有自己的生命周期和适用范围:所有打开的引用都关闭后,它会自动消失。手册将抽象套接字命名空间明确称为不可移植的Linux扩展。这两个限定分别说明名字何时不再存在,以及该命名方式属于什么平台范围;它们没有把抽象名字改写为普通文件,也没有宣布其他系统必然提供相同命名空间。[1]

本文采用Linux man-pages 6.19的静态地址定义,不执行套接字调用或讨论权限、凭据与部署。条目日期和网页生成日期均不作为首次发布日期。[1]

资料来源:
[1] [unix(7) — Linux manual page](https://man7.org/linux/man-pages/man7/unix.7.html)

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。