【问题标题】:Is there any portable or at least vendor-specific way to detect if a Unix socket is orphaned?是否有任何可移植的或至少特定于供应商的方法来检测 Unix 套接字是否是孤立的?
【发布时间】:2020-12-19 15:47:04
【问题描述】:
当一个进程创建UDS并异常退出时,它会留下一个socket文件。下次运行时,程序可能无法看到文件已存在。
有什么方法可以检测套接字文件是否为孤立文件?最好的方法应该是 POSIX,并且可以在任何 UNIX 品牌上使用,但也可以使用 Linux/FreeBSD/Solaris/whatever-specific。
我不是问怎么做
- 使
/tmp 在重新启动时被清除。有时应用程序在没有重启的情况下崩溃。
- 使用任何 GUI 甚至命令行工具手动检查。
- 在运行程序之前删除文件列表或在
bind 之前放置unlink。
【问题讨论】:
标签:
unix
system-calls
unix-socket
【解决方案1】:
好吧,看来我离答案只有一步之遥了。
- 对于 UDS,没有什么能比得上
SO_REUSEADDR,我相信这是有充分理由的
- 有一种方法可以用锁文件来保护套接字文件,这是一种(相对)干净和理智的方法
使用/tmp/socket.lock保护/tmp/socket,我们必须
- 用
O_RDONLY | O_CREAT打开它
- 请关注
LOCK_EX | LOCK_NB
永远不要对守卫做任何事情。如果flock 在下次运行时成功,则没有进程持有锁定文件,相应地,没有进程使用套接字。我们可以删除它。
当然,我们假设每个使用套接字的程序也使用该协议。
详情在Victor Gadov's github,由于互联网链接的脆弱性,复制到这里。