退出应用程序时如何删除 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
我有一个服务器应用程序,它在特定路径中创建一个 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