我目前正在尝试解决创建进程 A 的问题,该进程创建了一个 Unix 套接字以连接到服务器进程。然后我 fork 进程 A 并获得一个新的子进程 B。此时我有 2 个进程,具有重复的描述符等。
你很快就忽略了这些细节,但我认为你并没有完全理解其中的意义。进程 B 确实继承了 A 的所有打开文件描述符的副本fork()
,但这并不意味着套接字本身被复制。那将如何运作?就远程对等点而言,只有一个连接。B 继承的是整数文件描述符编号和操作系统维护的(非进程特定的)打开文件描述表之间的特定于进程的关联。因此, B 没有原始套接字的副本,而是相同的套接字。
当进程 B 向服务器发送消息时,服务器会处理该消息,然后将其发送回进程 A(但它应该返回到进程 B)。
远程服务器从 B 中不知道 A。它只有一个连接,这就是它引导其响应的地方。原则上,A 或 B 都可以获得它,但 A 始终赢得那场比赛是合理的。
我确定这是因为 A 和 B 是重复的,
是的,部分。
而且不知何故,从服务器的角度来看,Unix 套接字仍然是一个“进程 A 套接字”,无论谁发送它们,所有消息都会返回到 A。
不,见上文。
除了在进程 A 和 B 中断开和重新连接 post-fork 之外,还有什么方法可以解决这个问题?
如果 B 重新连接是一个可行的解决方案,那么让它首先建立自己的连接,而不是从 A 继承一个呢?但是如果 A 需要代表 B 建立连接,那么 A 应该在 fork B 之后关闭它,交给 B 独占使用。如果 A 需要自己与服务器的连接,那么它可以在分叉后建立一个新的连接。或者,如果自己的连接已经打开,A 可以在分叉之前建立第二个连接,并将那个连接交给 B,保留它自己的原始连接。在这种情况下,A 不仅想要关闭它的 B 连接副本,而且 B 想要关闭它的 A 连接副本。