【发布时间】:2019-05-08 21:47:32
【问题描述】:
在man unix(7)我发现了以下内容:
路径名:一个 UNIX 域套接字可以绑定到一个空终止的 使用 bind(2) 的文件系统路径名。当路径名的地址 socket 被返回(通过上面提到的系统调用之一),它的 长度是
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中保存的字符串数据的终止空字符。strlen本身的结果不考虑终止符占用的空间。 -
结构体大小为
sizeof(struct sockaddr_un)。offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1更接近数据的大小,并且假设存在 null 字符,则需要 +1。