是否有任何可移植的或至少是供应商特定的方法来检测 Unix 套接字是否是孤立的?

问题描述

一个进程创建UDS并异常退出时,它会留下一个套接文件。下次运行时,程序可能无法看到文件已经存在。

有没有办法检测套接文件是否是孤立的?最好的方法应该是 POSIX,并且可以在任何 UNIX 品牌上使用,但也可以使用 Linux/FreeBSD/Solaris/任何特定的东西。

我不是在问如何

  • make /tmp 在重启时被清除。有时应用程序会在不重启的情况下崩溃。
  • 使用任何 GUI 甚至命令行工具手动检查它。
  • 在运行程序之前删除文件列表或在 unlink 之前添加 bind

解决方法

好吧,看来我离答案只有一步之遥了。

  1. UDS 没有比 SO_REUSEADDR 更像的东西,我相信这是有充分理由的
  2. 有一种用锁文件保护套接字文件的方法,这是一种(相对)干净和理智的方法

使用 /tmp/socket.lock 来保护 /tmp/socket,我们必须

  1. O_RDONLY | O_CREAT打开它
  2. LOCK_EX | LOCK_NB

永远不要对守卫做任何事情。如果 flock 在下一次运行成功,则没有进程持有锁文件,也没有进程使用套接字。我们可以删除它。

当然,我们假设每个使用套接字的程序也使用该协议。

详细信息位于 Victor Gadov's github,由于 Internet 中链接的脆弱性,复制到此处。