当两个进程侦听同一个 Berkeley/Unix [文件] 套接字时会发生什么?

当两个进程侦听同一个 Berkeley/Unix [文件] 套接字时会发生什么?

当我设置两个进程来监听相同的进程时会发生什么伯克利插座

消息是否会同时路由到两者?两者都不?两者之一?如果是这样,怎么办?

具体来说,我可以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 套接字,其中套接字的名称是其实际地址,并且不使用任何类型的文件系统对象。对于这些,您也无法将两个套接字绑定到同一地址。

相关内容