unix 套接字创建然后 fork(),消息传递混淆

unix socket creation then fork(), messaging gets mixed up

我目前正在尝试解决创建 process A 的问题,它会创建一个 Unix 套接字以连接到服务器进程。然后我 fork process A 并得到一个新的 child process B。此时我有2个进程,有重复的描述符等。当process B向服务器发送消息时,服务器处理消息然后将其发送回process A(但它应该返回process B)。我确定这是因为 AB 是重复的,不知何故,从服务器的角度来看,Unix 套接字仍然是 " process A socket",无论谁发送,所有消息都会返回到 A他们。

除了在进程 A 和 B 中断开并重新连接 post-fork 之外,还有什么方法可以解决这个问题吗? (进程AB是master/worker模式下的haproxy)?谢谢!

I'm currently trying to solve an issue where I create a process A, which creates a Unix socket to connect to a server process. I then fork the process A and get a new child process B. At this point I have 2 processes, with duplicate descriptors,etc..

您很快忽略了这些细节,但我认为您没有完全理解其中的重要性。进程 B 确实继承了 fork() 中所有 A 的打开文件描述符的副本,但这并不意味着套接字本身被复制了。那将如何工作?就远程点而言,只有一个连接。 B 继承的是一个 process-specific 整数文件描述符编号和操作系统维护的(非 process-specific)table 打开文件描述之间的关联。因此,B 没有原始套接字的副本,而是同一个套接字

when process B sends a message to the server, the server processes the message and then sends it back to process A (but it should go back to process B).

远程服务器不知道 A 和 B。它只有一个连接,这是它指示响应的地方。原则上,A 或 B 都可以收到它,但 A 始终赢得那场比赛似乎是合理的。

I am certain this is because A and B are duplicates,

是的,部分。

and somehow the Unix socket from the server's perspective is still a " process A socket", and all messages will go back to A no matter who sends them.

没有。见上文。

Is there any way to resolve this other than disconnecting and reconnecting post-fork in both processes A and B?

如果 B 重新连接是一个可行的解决方案,那么让它首先建立自己的连接,而不是从 A 继承连接怎么样?但是如果A需要代表B建立连接,那么A应该在fork B之后关闭它,交给B独占使用。如果 A 需要自己与服务器的连接,那么它可以在分叉后建立一个新的连接。或者,如果它自己的连接已经打开,A 可以在分叉之前建立第二个连接,然后将那个连接交给 B,同时保留它自己的原始连接。在那种情况下,不仅 A 想关闭它的 B 连接副本,而且 B 也想关闭它的 A 连接副本。

我做了一些额外的研究,还有另一种方法可以做到这一点,我了解到 pthread_atfork() 它设置了父子在 fork 时调用的函数..我实际上使用了这个停止和启动子网络功能的机制,它起作用了!

https://linux.die.net/man/3/pthread_atfork