【问题标题】: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】:

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

    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,由于互联网链接的脆弱性,复制到这里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 2022-09-24
      相关资源
      最近更新 更多