【问题标题】:How can I delete a UNIX Domain Socket file when I exit my application?退出应用程序时如何删除 UNIX 域套接字文件?
【发布时间】:2016-04-24 17:04:38
【问题描述】:

我有一个服务器应用程序,它在具有名称和bind()s 的特定路径中创建一个 UNIX 域套接字。

只有当我从应用程序代码中有意关闭/停止应用程序时,我才需要删除套接字;否则需要打开。我该怎么做呢?

谢谢!

编辑:假设我从终端内启动和运行我的应用程序。

【问题讨论】:

    标签: c sockets unix-socket


    【解决方案1】:

    执行

    unlink("Path/to/Socket");
    

    在您退出程序之前。

    【讨论】:

    • 但是我从终端退出了我的应用程序,那么我应该将取消链接放在代码中的什么位置?
    【解决方案2】:

    你可以用一个简单的方法移除socket文件:

    unlink(path);
    

    无论你在哪里退出你的程序,检查它是否存在,然后删除它。

    【讨论】:

    • 但是我从终端退出了我的应用程序,那么我应该将取消链接放在代码中的什么位置?
    • 从哪里退出应用程序并不重要,除非你说你正在点击Control-C 或其他东西。在这种情况下,您需要创建一个信号处理程序,在退出之前处理套接字。
    【解决方案3】:

    如果您的应用程序有多个退出点,并且您不想修改每个退出点来调用清理例程,那么您可以使用“脏”方法。

    当套接字刚刚创建时,使用atexit(3) 注册清理例程。当应用程序正常终止时,将调用例程(只是对unlink(2) 的调用)。但如果应用程序以信号终止,则不会调用它。所以,如果你想在接收到 SIGINT 和类似信号后进行清理,你还需要正确设置信号处理程序。

    【讨论】:

    • 好的,但文件仍然存在。我还需要从文件夹中删除文件
    • @Pheonix7,你检查过 unlink 的退出代码是否有错误吗?
    • 当我用 ctr+c 退出应用程序时,终端什么也没说。当我重新启动应用程序时,出现绑定错误:正在使用的地址
    【解决方案4】:

    你让这变得比它需要的更难。将unlink() 放在bind() 之前。其他人都是这样做的。 (例如:BSD syslogd,经典的基于 unix-domain-socket 的服务之一)

    【讨论】:

    • 谢谢。我想我必须去绑定。感谢您指定它必须先去。
    • 您仍然可以在退出时取消链接,以防止在服务器未运行时陈旧的套接字出现在目录列表中。但这纯粹是装饰性的。
    【解决方案5】:

    您可以通过查看 /proc/net/unix 来检查套接字是否处于活动状态。然后删除,在 cron 中,或者在你启动/重启你的应用程序之前。

    echo "active sockets in /path/"
    cat /proc/net/unix | grep -Eo '/path/.*'
    
    echo "all sockets in path including stale sockets"
    ls -1F /path/ | egrep '=$' | sed 's/=$//'
    
    echo "example command to remove stale sockets"
    comm -1 -3 <(cat /proc/net/unix | grep -Eo '/path/.*' | sort)  <(ls -1F /path/ | egrep '=$' | sed 's/=$//' | sort) | xargs -n1 echo rm
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 2012-04-22
      • 2014-06-02
      • 2018-05-14
      • 2019-02-03
      • 2015-07-20
      • 1970-01-01
      相关资源
      最近更新 更多