关于原因,nwildner已经写了一个很好的答案。
在这里,我将只关注方式和相对路径的用法。
在内部,虽然套接字文件也可以按名称查找(我想),但它们通常由inode查找。在Linux中,此查找由net / unix / af_unix.c中unix_find_socket_byinode()
定义的函数确保。
可以很容易地检查如下:
- 创建两个目录A /和B /。
- 在每个目录下,使进程侦听具有相同名称的套接字文件。与
socat
您一起使用以下命令:
$ socat UNIX-LISTEN:./my.sock -
- 现在通过将A / my.sock移到B /来交换套接字文件反之亦然。
- 从现在开始,如果客户端应用程序连接到A / my.sock,它将与服务器B联系,如果连接到B / my.sock,则将与服务器A联系(请注意,当通信结束时,服务器进程可能会合法删除它认为是其自己的套接字文件的文件)。
我在少数Unix系统(Linux Debian,FreeBSD和OpenIndiana)上检查了此行为,因此,即使不是标准情况,这种行为似乎至少也很广泛。
绝对路径通常用作客户端和服务器进程之间的约定,因为客户端进程可能不知道如何与服务器建立初始通信。
但是,如果此初始通信不是问题,那么使用相对路径创建套接字文件似乎是安全的,当套接字文件的位置不受服务器进程直接控制时,可以避免出现路径长度问题。