【发布时间】:2016-04-24 17:04:38
【问题描述】:
我有一个服务器应用程序,它在具有名称和bind()s 的特定路径中创建一个 UNIX 域套接字。
只有当我从应用程序代码中有意关闭/停止应用程序时,我才需要删除套接字;否则需要打开。我该怎么做呢?
谢谢!
编辑:假设我从终端内启动和运行我的应用程序。
【问题讨论】:
标签: c sockets unix-socket
我有一个服务器应用程序,它在具有名称和bind()s 的特定路径中创建一个 UNIX 域套接字。
只有当我从应用程序代码中有意关闭/停止应用程序时,我才需要删除套接字;否则需要打开。我该怎么做呢?
谢谢!
编辑:假设我从终端内启动和运行我的应用程序。
【问题讨论】:
标签: c sockets unix-socket
执行
unlink("Path/to/Socket");
在您退出程序之前。
【讨论】:
你可以用一个简单的方法移除socket文件:
unlink(path);
无论你在哪里退出你的程序,检查它是否存在,然后删除它。
【讨论】:
Control-C 或其他东西。在这种情况下,您需要创建一个信号处理程序,在退出之前处理套接字。
如果您的应用程序有多个退出点,并且您不想修改每个退出点来调用清理例程,那么您可以使用“脏”方法。
当套接字刚刚创建时,使用atexit(3) 注册清理例程。当应用程序正常终止时,将调用例程(只是对unlink(2) 的调用)。但如果应用程序以信号终止,则不会调用它。所以,如果你想在接收到 SIGINT 和类似信号后进行清理,你还需要正确设置信号处理程序。
【讨论】:
你让这变得比它需要的更难。将unlink() 放在bind() 之前。其他人都是这样做的。 (例如:BSD syslogd,经典的基于 unix-domain-socket 的服务之一)
【讨论】:
您可以通过查看 /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
【讨论】: