在接受套接字之前创建的子进程中使用父进程接受的套接字
Use a socket accepted by the parent process, in a child process created before accepting the socket
我正在使用 "pre forking model" 和 C 语言编写一个跨平台、多进程和多线程的服务器。
根据模式(多进程或多线程),服务器刚启动时,创建一组processes/threads,其任务是处理主服务器接受的客户端请求。
因为子进程是在接受套接字之前创建的,所以它们显然不会继承接受的套接字。
在 win32 中我解决了,复制套接字。
我如何在 C linux 中做?
使用 Unix 域套接字而不是管道进行父子之间的任何控制通信。与管道不同,它们是双向的。如果您使用数据报套接字,每个 send()
对应一个 recv()
,反之亦然(即保留消息边界),这使得传递结构等更容易。
重点是,您可以使用 Unix 域套接字在进程之间传递描述符。 cmsg man page 有示例代码。
本质上,在你 fork 子进程之前,你创建了一个 Unix 域套接字对,对于每个子进程都是唯一的,用于控制父子进程之间的通信。我推荐使用 Unix 域数据报套接字。
当父进程希望将连接移交给子进程时,它会向子进程发送一条消息,其中 SCM_RIGHTS
辅助消息包含已连接的套接字描述符。 (内核会处理复制描述符的细节;只是注意在接收过程中描述符编号可能不同。)
这种方法不仅适用于 Linux,而且适用于 BSD。
我正在使用 "pre forking model" 和 C 语言编写一个跨平台、多进程和多线程的服务器。 根据模式(多进程或多线程),服务器刚启动时,创建一组processes/threads,其任务是处理主服务器接受的客户端请求。 因为子进程是在接受套接字之前创建的,所以它们显然不会继承接受的套接字。 在 win32 中我解决了,复制套接字。 我如何在 C linux 中做?
使用 Unix 域套接字而不是管道进行父子之间的任何控制通信。与管道不同,它们是双向的。如果您使用数据报套接字,每个 send()
对应一个 recv()
,反之亦然(即保留消息边界),这使得传递结构等更容易。
重点是,您可以使用 Unix 域套接字在进程之间传递描述符。 cmsg man page 有示例代码。
本质上,在你 fork 子进程之前,你创建了一个 Unix 域套接字对,对于每个子进程都是唯一的,用于控制父子进程之间的通信。我推荐使用 Unix 域数据报套接字。
当父进程希望将连接移交给子进程时,它会向子进程发送一条消息,其中 SCM_RIGHTS
辅助消息包含已连接的套接字描述符。 (内核会处理复制描述符的细节;只是注意在接收过程中描述符编号可能不同。)
这种方法不仅适用于 Linux,而且适用于 BSD。