57 UNIX domain socket
UNIX 域套接字 bind()
时会在文件系统上面创建文件
UNIX domain socket 在 bind 的时候会在文件系统上面创建一个 socket 文件。
如果文件系统上面已经有该路径,则会绑定失败。往往是服务器在 bind()
之前调用 remove()
来尝试删除旧文件(remove()
既可以删除文件夹又可以删除普通文件),在不再需要 socket 时也会立即调用 unlink()
来删除 socket,等所有使用该 socket 的进程退出之后文件就会被文件系统自动清理。
Linux 特有的抽象 socket 名字空间
在 bind()
的时候把 struct sockaddr_un
的 sun_path
字段的第一个字节指定为 '\0'
,后面仍然填 socket 名字,则可以为 socket 创建一个抽象名字,这样 socket 就不会出现在文件系统上面,也不会和文件系统上面的条目冲突。
UNIX domain 数据报 socket 能传输的最大大小
通过 SO_SNDBUF
选项和 /proc 文件系统下面的限制表示。可以参考 socket(7)。我本地看是 212992。
为 UNIX domain socket 创建 socket 对
socketpair()
系统调用有一点像 pipe()
系统调用,前者会创建匿名的 socket 对,可以跨过 fork()
共享给子进程。这个系统调用为我们省去了 socket()
、bind()
、listen()
、connect()
、accept()
等环节,而且创建的 socket 对外是不可见的。
socketpair()
只能用在 AF_UNIX
这种 domain 上面。和 pipe()
相比的好处是:除了可以指定流类型之外,还能指定数据报类型,这样我们就不用自己去划分数据的边界。