我有一个服务器应用程序,它在特定路径中创建一个UNIX域套接字,其名称和bind()
s。
只有当我在应用程序代码中故意关闭/停止应用程序时才需要删除套接字;否则它需要开放。我该怎么做呢?
谢谢!
编辑:考虑我从终端内部启动并运行我的应用程序。
答案 0 :(得分:13)
你正在努力使它变得比它需要的更难。将unlink()
放在bind()
之前。这就是其他人如何做到的。 (示例:BSD syslogd,基于unix-domain-socket的经典服务之一)
答案 1 :(得分:2)
如果您的应用程序有多个退出点,并且您不想修改每个退出点以调用清理例程,那么您可以使用“脏”方法。
刚刚创建套接字时,请使用atexit(3)
注册清理例程。当应用程序正常终止时,将调用例程(这只是对unlink(2)
的调用)。但如果应用程序以信号终止,则不会调用它。因此,如果要在接收到SIGINT和类似信号后进行清理,还需要正确设置信号处理程序。
答案 2 :(得分:1)
执行
unlink("Path/to/Socket");
退出程序前。
答案 3 :(得分:0)
您可以使用简单的
删除套接字文件unlink(path);
无论您何时编程退出程序,请检查它是否存在,然后将其删除。
答案 4 :(得分:0)
可以通过查看/ 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