【发布时间】:2020-10-20 15:31:44
【问题描述】:
我目前正在尝试解决我创建process A 的问题,该process A 创建了一个Unix 套接字以连接到服务器进程。然后我分叉process A 并得到一个新的孩子process B。此时我有2个进程,具有重复的描述符等。当process B向服务器发送消息时,服务器处理消息然后将其发送回process A(但它应该回到process B )。我确信这是因为A 和B 是重复的,不知何故,从服务器的角度来看,Unix 套接字仍然是" process A socket",并且无论谁发送它们,所有消息都会返回到 A。
除了在进程 A 和 B 中断开和重新连接 post-fork 之外,还有什么方法可以解决这个问题? (进程A 和B 是主/从模式下的haproxy)?谢谢!
【问题讨论】:
-
这是用于A和B之间的通信吗?
-
对不起,不,我希望 A 与服务器通信并获取其响应,B 与服务器通信并返回其响应..
-
原则上我希望进程 B 也能够接收来自服务器的回复,但是如果 B 正在发送请求,则 A 更有可能在这里赢得固有的比赛。 B 是否收到服务器为 A 的请求发送的回复?
-
响应将返回到最先读取它的任何进程。如果两个进程同时在
read()中被阻塞,则无法预测哪一个会得到响应。 -
你的怀疑是错误的。您不需要在父子节点中重新打开套接字。在
fork()之后,进程中的文件描述符引用相同的文件描述,这就是为什么任何一个进程都可以读取回复的原因。如果其中一个进程关闭其文件描述符,则文件描述不受影响,因为另一个进程仍然持有对它的引用。您只需在 一个 进程中关闭并重新打开连接。
标签: c linux fork haproxy unix-socket