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

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

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

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

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

【问题讨论】:

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

标签: c++ networking fork


【解决方案1】:

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 2015-05-31
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多