我有一个服务器应用程序,在特定路径下创建一个名为UNIX套接字,并通过
bind()
进行绑定。
我需要仅在故意关闭/停止应用程序时从应用程序代码内删除该套接字;否则它需要保持开启。如何实现?
谢谢!
编辑:考虑我从终端内启动和运行我的应用程序。bind()
进行绑定。
我需要仅在故意关闭/停止应用程序时从应用程序代码内删除该套接字;否则它需要保持开启。如何实现?
谢谢!
编辑:考虑我从终端内启动和运行我的应用程序。你正在把这件事情搞得比必要的还要困难。把 unlink()
放在 bind()
之前就可以了。这是其他人都这么做的方式。(例如:BSD syslogd,其中一个经典的基于 Unix 域套接字的服务)
atexit(3)
注册清理例程。当应用程序正常终止时,将调用该例程(它只是一个对unlink(2)
的调用)。但是如果应用程序被信号终止,则不会调用它。因此,如果您想在收到SIGINT和类似信号后进行清理,还需要正确设置信号处理程序。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
sockaddr_un.sun_path
中的第一个字节设置为\0
,并保留在此数组中的其他字节。抽象套接字不会放置在文件系统上,这具有轻微的副作用。
man 7 unix
抽象套接字
对于抽象套接字,套接字权限没有意义:在绑定抽象套接字时,进程umask(2)没有影响,并且更改对象的所有权和权限(通过fchown(2)和fchmod(2))对套接字的可访问性没有影响。
当所有对套接字的打开引用都关闭时,抽象套接字会自动消失。
抽象套接字命名空间是非便携式的Linux扩展。
只需执行
unlink("Path/to/Socket");
您可以通过简单的方式删除套接字文件:
unlink(path);
Control-C
或其他什么。在这种情况下,你需要创建一个信号处理程序,在退出之前处理套接字。 - David Hoelzer