为什么在Linux上Unix套接字的最大路径长度是108?

19
创建Unix套接字时,路径名(man 7 unix)最多允许108个字符长度。对于我的朋友来说,他的路径太长了,导致程序出现了错误。现在我们想知道这个数字是如何确定的。
我怀疑这个数字是通过比较sockaddr_un结构体的sizeof与其他sockaddress(如sockaddr_in)的sizeof来明确确定的。但是,如果他们想避免与其他sizeof值冲突,为什么不使用质数呢?能否提供一个权威的来源来证实这一点?

2
为什么质数会避免与其他类型的大小相同? - Ed Heal
1
虽然很多结构体的大小都是2的倍数(可能有一半),但将其设置为质数大小并不能避免冲突。如果程序员在使用错误的结构体时犯了这个基本错误,那么这样做有什么意义呢? - Ed Heal
3
根据Michael Kerrisk所说,SusV3(Single Unix规范)没有指定sun_path字段的大小。早期的BSD实现使用了108和104字节,而当代一个实现(HP-UX 11)使用了92字节。可移植应用程序应该编写到这个较低的值,并使用snprintf()或strncpy()来避免在写入这个字段时出现缓冲区溢出。因此,这似乎没有关于素数(只有偶数)的魔法...就像许多文件系统中文件名的255这样的任意限制。 - Gerard Rozsavolgyi
我能找到的只是提及在不同实现中大小不同的信息(Linux手册、APUE和POSIX),从未涉及与大小有关的原因。 - Michael Burr
1
@user3629249 我们这里不是在谈论IPv4/IPv6,而是Unix套接字,一种在Unix系统上进行本地进程间通信的形式,与网络通信无关 - https://en.wikipedia.org/wiki/Unix_domain_socket - nos
显示剩余5条评论
2个回答

7

这是为了匹配一个方便的内核数据结构可用的空间。

编辑:

引用McKusick等人的《4.4BSD操作系统的设计和实现》(第369页):

内存管理设施围绕着一个叫做 mbuf 的数据结构展开。Mbuf,或者内存缓冲区,长度为128个字节,其中100个或者108个字节用于数据存储。


你能提供更多的细节吗(例如涉及的内核数据结构)? - Michael Burr

5
如果有时你找不到它,那可能意味着没有可找的内容。但也可能意味着你找不到它。然而,我想分享到目前为止我所发现的内容,并且我猜这个数字是任意的。我的猜测得到了GNU C Library中这两个语句的支持:
``` char sun_path[108] ```
这是要使用的文件名。不完整:为什么108是一个神奇的数字?RMS建议将其设为零长度数组,并调整以下示例以使用alloca根据文件名的长度分配适当数量的存储空间。
(其中RMS应该是Richard M. Stallman(另一个猜测))

char sa_data[14]

这是实际的套接字地址数据,其格式取决于格式。它的长度也取决于格式,可能远大于14。sa_data的长度14基本上是任意的


有趣的是,RMS(很可能是Richard Stallman)建议将其作为零长度数组。现代Windows内核具有以单字节数组结尾的结构,预计应将其分配为(sizeof(thedata)+ sizeof(thestruct))字节。 - sjcaged

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接