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

How can I delete a UNIX Domain Socket file when I exit my application?

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

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

谢谢!

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

直接执行

unlink("Path/to/Socket");

退出程序之前。

您可以使用简单的方法删除套接字文件:

unlink(path);

无论您在何处编写程序,请退出您的程序,检查它是否存在,然后将其删除。

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

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

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

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

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