Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么linux 108上的unix套接字允许最大路径长度?_C_Linux_Sockets_Unix Socket - Fatal编程技术网

C 为什么linux 108上的unix套接字允许最大路径长度?

C 为什么linux 108上的unix套接字允许最大路径长度?,c,linux,sockets,unix-socket,C,Linux,Sockets,Unix Socket,创建unix套接字时,路径名(man 7 unix)的最大长度允许为108个字符。对于一个朋友来说,这在他的程序中造成了一个bug,因为他的路径更长。现在我们想知道这个数字究竟是如何确定的 我怀疑该数字的确定是为了使该结构的sockaddr\u un的sizeof与其他sockaddr\u in等sockaddress的sizeof相比是明确的。但是如果他们想避免与其他sizeof值发生冲突,为什么不使用质数作为例子呢?有人能提供一个权威的来源吗?如果你有时找不到它,那就意味着找不到任何东西。但

创建unix套接字时,路径名(
man 7 unix
)的最大长度允许为108个字符。对于一个朋友来说,这在他的程序中造成了一个bug,因为他的路径更长。现在我们想知道这个数字究竟是如何确定的


我怀疑该数字的确定是为了使该结构的
sockaddr\u un
sizeof
与其他sockaddr\u in等sockaddress的sizeof相比是明确的。但是如果他们想避免与其他sizeof值发生冲突,为什么不使用质数作为例子呢?有人能提供一个权威的来源吗?

如果你有时找不到它,那就意味着找不到任何东西。但这也可能意味着你找不到它。然而,我想与大家分享我迄今为止的发现

我很难猜测这个数字是任意的

我的猜测得到了以下两种说法的支持:

char sun\u路径[108]

这是要使用的文件名。不完整:为什么108是一个神奇的数字? RMS建议将其设置为零长度数组并调整示例 下面是使用alloca分配适当存储量的步骤 基于文件名的长度

(其中RMS应该是Richard M.Stallman(另一种猜测))

日期类型:struct sockaddr
...

char sau数据[14]

这是实际情况 套接字地址数据,与格式有关。它的长度也是 取决于格式,很可能超过14。14的长度 sa_数据基本上是任意的


PS:不知道为什么,但这类问题让我很好奇。

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

编辑:

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

内存管理设施围绕数据结构运行 称为mbuf。MBUF或内存缓冲区长度为128字节,具有 此空间中为数据存储保留的100或108字节


为什么素数可以避免其他类型的大小?@EdHeal也许我弄错了,但将2的倍数相加(由对齐引起)将不再使结构与其大小匹配。或者我可以问,如果目标是避免冲突,为什么要使用偶数?这似乎表明我对这个数字的怀疑可能是错误的。假设很多结构是两个的倍数(可能是一半)。但是制作质数大小的东西并不能避免冲突。无论如何,如果程序员把这个基本部分弄错了,并且使用了错误的结构,那么这样做有什么意义呢?根据Michael Kerrisk的说法,SusV3(单一Unix规范)没有指定sun_路径字段的大小。早期的BSD实现使用108和104字节,而一个当代实现(HP-UX 11)使用92字节。可移植应用程序应编码到此较低的值,并在写入此字段时使用snprintf()或strncpy()避免缓冲区溢出。所以素数似乎没有什么魔力(只有偶数)。。。只是一些任意的限制,比如许多文件中文件名的255systems@user3629249这里我们不是在讨论ipv4/ipv6,而是unix套接字,unix系统上的一种本地进程间通信形式,与网络通信无关。您是否能够提供一些更详细的信息(例如所讨论的内核数据结构)?