退出应用程序时如何删除UNIX域套接字文件?

时间:2016-01-19 09:36:01

标签: c sockets unix-socket

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

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

谢谢!

编辑:考虑我从终端内部启动并运行我的应用程序。

5 个答案:

答案 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