【问题标题】:Child write on file descriptors created in parent after fork子级在 fork 之后在父级中创建的文件描述符上写入
【发布时间】:2014-02-06 13:33:58
【问题描述】:

我有一个父进程侦听套接字上的传入连接,在接受客户端后,它会将关联的文件描述符和其他日期传递给子进程(通过命名管道)。

从这一刻起,子进程将为客户端提供服务,父进程继续监听新的客户端。

我的问题是,当我尝试在子进程中写入文件描述符时,我会收到错误(错误的文件描述符)并且写入失败。我的猜测是,由于这些文件描述符是在 fork 之后创建的,因此子进程不能简单地使用它们,它们只属于父进程。

所以这是写失败的原因吗?有没有办法让孩子使用这些文件描述符?


解决方案
正如 loreb 在回答中提到的那样,以这种方式不可能达到预期的结果。我通过使用另一个管道将响应从孩子定向到父母进行了临时修复。由于文件描述符属于父级,它可以通过套接字将响应转发回客户端。

【问题讨论】:

  • 为什么不在父进程中创建套接字,以便在父子进程之间共享文件描述符..
  • @Abhiteshkhatri 因为我的客户端将在分叉发生后继续连接,并且分叉后创建的文件描述符不会在父子之间共享。
  • 您可以在 fork 之前创建共享内存并将文件描述符保存在共享内存上(我怀疑如何将文件描述符放在共享内存上)。如果是这样,那么您的描述符将在孩子和父母之间共享..
  • 不幸的是,对于这个特定的任务,我们不允许使用共享内存,而且我之前没有处理过在共享内存上存储文件描述符的问题。所以我不确定我们是否可以在这里使用共享内存。

标签: c++ unix process fork file-descriptor


【解决方案1】:

要将文件描述符传递给 AF_UNIX 套接字,而不是命名管道。 您将需要 sendmsg(3),它使用起来非常奇怪,因此您最好在网上查找一些示例——例如 libowfat 中的 io_passfd。

编辑:如果有人偶然发现这个答案,不要使用 AF_UNIX 客户端/服务器,使用 socketpair(2)

【讨论】:

  • 感谢您的回复。因此,根据您的回答,传递文件描述符并不像将整数值传递给孩子那么简单。对于我正在处理的这个任务,不可能使用 sendmsg() 系统调用。我想我必须在这里做一些重新设计。再次感谢。
  • 对,没那么简单;如果您对细节感兴趣,在右侧的“相关”部分中有一些很好的解释。
【解决方案2】:

也许您应该尝试关闭并重新打开该 FD。

【讨论】:

  • 文件描述符属于一个活动的套接字连接,所以我想它不像在父级中关闭它并在子级中重新打开它那么简单。
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 2011-01-19
  • 2011-10-02
  • 2011-02-28
  • 1970-01-01
  • 2015-07-25
  • 2012-07-28
  • 2015-09-14
相关资源
最近更新 更多