57 UNIX domain socket

UNIX 域套接字 bind() 时会在文件系统上面创建文件

UNIX domain socket 在 bind 的时候会在文件系统上面创建一个 socket 文件。

如果文件系统上面已经有该路径,则会绑定失败。往往是服务器在 bind() 之前调用 remove() 来尝试删除旧文件(remove() 既可以删除文件夹又可以删除普通文件),在不再需要 socket 时也会立即调用 unlink() 来删除 socket,等所有使用该 socket 的进程退出之后文件就会被文件系统自动清理。

Linux 特有的抽象 socket 名字空间

bind() 的时候把 struct sockaddr_unsun_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() 相比的好处是:除了可以指定流类型之外,还能指定数据报类型,这样我们就不用自己去划分数据的边界。