![当两个进程侦听同一个 Berkeley/Unix [文件] 套接字时会发生什么?](https://linux22.com/image/182015/%E5%BD%93%E4%B8%A4%E4%B8%AA%E8%BF%9B%E7%A8%8B%E4%BE%A6%E5%90%AC%E5%90%8C%E4%B8%80%E4%B8%AA%20Berkeley%2FUnix%20%5B%E6%96%87%E4%BB%B6%5D%20%E5%A5%97%E6%8E%A5%E5%AD%97%E6%97%B6%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F.png)
当我设置两个进程来监听相同的进程时会发生什么伯克利插座?
消息是否会同时路由到两者?两者都不?两者之一?如果是这样,怎么办?
具体来说,我可以gunicorn
使用相同的路径启动两个进程,--bind unix:
并且不会发生明显的错误:
gunicorn --bind=unix:/path/to/some/socket
这似乎是一个非常简单的问题,尽管我无法在 SE 或其他地方找到明确的答案。
答案1
两个过程不能绑定(并监听)到同一个 unix 套接字。尝试绑定到已存在的 UNIX 套接字的进程将收到EADDRINUSE
错误。
具体来说,我可以使用相同的 --bind unix:/ 启动两个gunicorn进程,并且不会发生明显的错误
您的进程很可能gunicorn
在绑定到套接字文件之前实际上删除了它,因此它最终绑定到不同的Unix 套接字。
请记住,unix 套接字的实际地址是device_id:inode
元组,而不是访问它的路径。如果删除 unix 套接字,绑定到同一路径的程序最终将创建一个具有不同 inode 的不同套接字文件。
注意:所有这些都适用于“正常”、文件系统驻留的 Unix 套接字。 Linux也有抽象的unix 套接字,其中套接字的名称是其实际地址,并且不使用任何类型的文件系统对象。对于这些,您也无法将两个套接字绑定到同一地址。