在接受套接字之前创建的子进程中,使用父进程接受的套接字

时间:2019-01-22 16:11:57

标签: c linux sockets client-server preforking

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

1 个答案:

答案 0 :(得分:1)

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

重点是,您可以使用Unix域套接字在进程之间传递描述符。 cmsg man page包含示例代码。

基本上,在派生子进程之前,您需要创建一个Unix域套接字对,该对套接字对每个子进程都是唯一的,以控制父子进程之间的通信。我建议使用Unix域数据报套接字。

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

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