在unix(7)手册中,我找到了以下内容:
pathname: a UNIX domain socket can be bound to a null-terminated filesystem pathname using bind(2). When the address of a pathname socket is returned (by one of the system calls noted above), its length is
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
不清楚。
+1
是为了计算sun_path
中保存的字符串数据的终止 null 字符。 终止符占用的空间不会在strlen
函数的结果中被计算进去。 - WhozCraigsizeof(struct sockaddr_un)
。offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1
更接近数据的大小,假设存在一个 _null character_,则需要 +1。 - chux - Reinstate Monica