1

我正在使用“预分叉模型”和 C 语言编写一个跨平台、多进程和多线程服务器。根据模式(多进程或多线程),刚刚启动的服务器会创建一组进程/线程,其任务是处理主服务器接受的客户端请求。因为子进程是在接受套接字之前创建的,所以它们显然不会继承接受的套接字。在win32中我解决了,复制套接字。我如何在 C linux 中进行操作?

4

1 回答 1

1

使用 Unix 域套接字而不是管道进行父子之间的任何控制通信。与管道不同,它们是双向的。如果您使用数据报套接字,则每个都send()对应一个recv(),反之亦然(即保留消息边界),这使得传递结构等更容易。

关键是,您可以使用 Unix 域套接字在进程之间传递描述符。cmsg手册页有示例代码。

本质上,在你 fork 子进程之前,你创建了一个 Unix 域套接字对,对于每个子进程都是唯一的,用于控制父子进程之间的通信。我推荐使用 Unix 域数据报套接字。

当父进程希望将连接移交给子进程时,它会向子进程发送一条消息,其中SCM_RIGHTS包含一条包含连接的套接字描述符的辅助消息。(内核将处理复制描述符的细节;请注意,描述符编号在接收过程中可能会有所不同。)

这种方法不仅适用于 Linux,也适用于 BSD。

于 2019-01-22T16:27:07.990 回答