假设您有一个在启动时创建unix域套接字并开始监听它的应用程序。然后,应用程序的任何后续实例都连接到该套接字,将数据传递给第一个实例并退出(如果检测到另一个正在运行的实例,则只退出)。
据我所知,这种套接字表示为文件系统上的文件。让我们假设这个文件被随机的第三方程序或用户删除。现在,后续进程将无法检测到/与第一个实例通信。
第一个能检测到删除套接字文件,然后再重新创建它吗?
发布于 2019-02-03 09:35:57
无法重新创建已删除的Unix套接字文件。
实际上,您可以使用相同的路径创建另一个套接字文件(方法是再次将套接字文件描述符绑定到同一个地址),但是任何试图连接到它的客户端都将得到一个“拒绝连接”,而不是连接到最初绑定到它的套接字。
这是因为Unix套接字基本上绑定到inode,而不是路径。您可以轻松地检查netcat是否支持Unix套接字:
nc -lU /tmp/old_sock &
[1] 19241
ln -f /tmp/old_sock /tmp/new_sock; rm /tmp/old_sock
# or mv /tmp/old_sock /tmp/new_sock
echo yup | nc -U /tmp/new_sock
yup程序所能做的就是关闭旧套接字,创建另一个套接字并将其绑定到同一个地址。为了得到删除文件的通知,您可以在Linux上使用inotify(7),在BSD上使用kqueue(2),或者只需在路径上周期性地执行stat(2) (与任何其他文件一样)。
请注意,Linux还有“抽象”Unix套接字--套接字绑定到一个字节序列(1),而不是任何文件系统对象,并且这些套接字不受任何文件类型访问权限的限制,不能被“移除”或移动到不同的地址。
1 --您可以称它为“字符串”,但请注意,它也可以包含NUL字节,这与文件系统路径不同。
https://unix.stackexchange.com/questions/498395
复制相似问题