我们可以将 Unix 域套接字绑定到任何随机的现有文件吗?如果不是,您如何识别套接字使用的文件?
答案1
我们可以将 Unix 域套接字绑定到任意随机现有文件吗
不可以。该文件不应该存在,否则bind(2)
将会失败并显示EADDRINUSE
.bind(2)
将使用 中给定的路径创建一个新文件.sun_path
。
如果不是,您如何识别套接字使用的文件?
lsof
可能有帮助。最多一个观点。
或者ss
:
$ nc -Ul foo &
[3] 9268
$ ls -i ./foo
1179674 ./foo
$ ss -elx | grep -w 1179674
u_str LISTEN 0 5 foo 618789 * 0 <-> ino:1179674 dev:0/2072 peers:
(ss
上面的输出被手动修剪掉了空格)
该-l
选项将直接ss
选择仅侦听套接字,该-x
选项仅选择 Unix 套接字,以及-e
打印扩展信息的选项,作为我用来匹配文件的索引节点号。
两者都ss
只会lsof
看到当前的套接字网络命名空间;但是来自不同网络命名空间的两个unix套接字不能绑定到同一个文件。
您可能还想检查设备编号是否也匹配;但你应该小心行事,因为sock_diag(7)
(由ss
) 将以内核 ( ) 内部使用的格式返回它MMMm mmmm
,但 buggyss
会将其视为mmmM MMmm
用户态格式;上例中的设备号不是0/2072
, 而是8/24
( /dev/sdb8
) ;-)