分叉和传递套接字c ++

Posted

技术标签:

【中文标题】分叉和传递套接字c ++【英文标题】:Forking and passing sockets c++ 【发布时间】:2013-01-04 22:53:38 【问题描述】:

我是使用分叉的新手,我无法理解如何实现我想要的。我会尽力解释。

我有进程 A,它是在 Linux 上运行的功能性伯克利套接字服务器。

我需要进程 A 在后台将程序从磁盘加载到单独的非阻塞进程(进程 B)中。然后进程 A 需要通过进程 B 对进程 A 的套接字的控制。最后进程 A 需要结束,让进程 B 继续运行。

如果旧进程结束,我不清楚将套接字传递给新进程需要什么,以及创建允许原始进程结束的非阻塞新进程的最佳方法。

【问题讨论】:

A 是在启动 B 之前还是之后获取套接字? 我很好奇是否有办法在进程之间共享文件句柄。但是让我问一下:您是否考虑过将这两个程序结合起来,只使用线程在两个代码路径之间共享数据和套接字句柄? 可能重复的问题:***.com/questions/909064/… 【参考方案1】:

您无需做任何特别的事情。只需确保为您希望进程 B 继承的任何文件描述符清除 close on exec 标志,并为您不希望进程 B 继承的任何文件描述符设置。然后调用exec将进程A替换为进程B。进程B会以所有可继承的文件描述符原封不动地启动。

【讨论】:

那么 B 如何知道要使用哪些文件描述符?您需要单独传递此信息。 @Barmar:有一些好方法。一是事先约定。例如,如果它只获得一个 TCP 连接,则可以约定这将是文件描述符 3。您可以在调用 exec 之前使用dup2 将其放在那里。 (这就是标准输入、输出和错误的工作方式,对吗?)另一种方法是使用 B 的命令行参数。 我知道,这些是“你需要做的特别的事情”。我没有时间写答案,我试图推动你改进你的答案。 这是我最终使用的解决方案。而且我确实必须通过套接字 fds。我最终将它们写入文件,然后通过 execl 传递一个参数以读回 FD 列表。关闭关闭 exec 标志原来是我需要通过套接字的缺失部分。【参考方案2】:

如果您需要传递打开的文件(例如套接字)而不使用继承-通过-fork,您可以使用ioctlI_SENDFD。 Here is a very detailed description。 (有一个相应的机制来接收它。)您可以使用连接进程的命名管道或通过变体使用 Unix 域套接字来做到这一点。

【讨论】:

以上是关于分叉和传递套接字c ++的主要内容,如果未能解决你的问题,请参考以下文章

使用 DLL 将 C# StringBuilder / 字符串传递给 C++ char*

c++ vector<char> 和套接字

ZMQ:socket_send/recv 阻塞

c - WSAWaitForMultipleObjects 阻塞任何线程但最后一个

在 C 或 C++ 中的同一个套接字上同时读取和写入

C 和 C++ 中的套接字解​​释