在man unix(7)中,我发现了以下内容:
路径名:UNIX域套接字可以绑定到以空值结尾的 使用bind(2)的文件系统路径名。当一个路径名的地址 返回套接字(通过上述系统调用之一), 长度是
offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1
struct sockaddr_un
被定义为
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[108]; /* pathname */
};
所以我想我们可以简单地strlen(sun_path) + sizeof(sun_family)
做我不明白他们添加的+1
。能否请您解释一下?我了解offsetof
用于描述可移植性
在Linux上,上面的
offsetof()
表达式等于sizeof(sa_family_t)
,但其他一些实现包括其他 字段位于sun_path之前,因此offsetof()
表达式可移植地描述了地址结构的大小。
但是这个+1
对我来说还不清楚。
答案 0 :(得分:3)
如何计算结构的大小?
结构的大小为sizeof(struct sockaddr_un)
。
我不明白他们添加的+1。你能解释一下吗?
此处代码试图确定结构中使用(或使用)的数据的长度。
offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1
offsetof(struct sockaddr_un, sun_path)
这是直到(但不包括).sun_path
成员的偏移量。这是对先前成员和先前填充的 data 需求的强制转换计算。
strlen(sun_path)
是string的长度,其中.sun_path[]
中没有空字符。如果sun_path
不包含空字符,则结果为未定义行为(UB)。
+1
用于sun_path
中假定的空字符。
这种计算对于将{em>数据发送到struct sockaddr_un
的某个位置很有用,因为 数据的需求可能大大小于结构 >需求。
我想我们可以简单地
strlen(sun_path)
+sizeof(sun_family)
这是一个问题(取决于使用情况),因为
1)它不包含空字符。
2)它不考虑成员.sun_family
和.sun_path
之间的潜在填充。尽管在这种情况下,我会很惊讶地看到它。