问题描述
当一个进程创建UDS并异常退出时,它会留下一个套接字文件。下次运行时,程序可能无法看到文件已经存在。
有没有办法检测套接字文件是否是孤立的?最好的方法应该是 POSIX,并且可以在任何 UNIX 品牌上使用,但也可以使用 Linux/FreeBSD/Solaris/任何特定的东西。
我不是在问如何
解决方法
好吧,看来我离答案只有一步之遥了。
- UDS 没有比
SO_REUSEADDR
更像的东西,我相信这是有充分理由的 - 有一种用锁文件保护套接字文件的方法,这是一种(相对)干净和理智的方法
使用 /tmp/socket.lock
来保护 /tmp/socket
,我们必须
- 用
O_RDONLY | O_CREAT
打开它 - 用
LOCK_EX | LOCK_NB
永远不要对守卫做任何事情。如果 flock 在下一次运行成功,则没有进程持有锁文件,也没有进程使用套接字。我们可以删除它。
当然,我们假设每个使用套接字的程序也使用该协议。
详细信息位于 Victor Gadov's github,由于 Internet 中链接的脆弱性,复制到此处。