【问题标题】:Sharing file descriptor table with child after child has done an exec在孩子完成 exec 后与孩子共享文件描述符表
【发布时间】:2017-11-15 23:11:21
【问题描述】:

有什么方法可以创建一个新进程,即使在执行之后也可以共享您的文件描述符表? clone(CLONE_FILES) 不起作用,正如手册页所说:

如果共享文件描述符表的进程调用 execve(2),则其文件描述符表是重复的(未共享)。

【问题讨论】:

  • 这里的目标是什么?一旦进程不再是相同的可执行文件,为什么您还需要文件描述符表的实时共享副本?乍一看似乎很荒谬,所以我怀疑这可能是an XY problem
  • @ShadowRanger 我正在为 Linux 编写一个 x86 用户模式模拟器,并通过在 ptrace 下与模拟器同时运行一个真实进程并比较每条指令的 cpu 状态来对其进行测试。当需要模拟 mmap 调用时,我想采用父级中使用的 FD 并覆盖 edi 以在子级中使用它。这不是一个非常常见的用例,这是肯定的。
  • @JonathanLeffler 我不关心 POSIX,我只想让它在 Linux 上工作
  • @JonathanLeffler 我感觉我是世界上唯一一个真正想要这样做的人......
  • @tbodt 你可能是唯一一个想要这样做的人,出于某种原因,有些人会认为你是个白痴。

标签: c linux fork


【解决方案1】:

这可以通过向子进程注入一段自定义代码来完成,该代码负责接收 FD 并更新子进程的描述符表。

子进程应在其上创建 AF_UNIX 套接字和 recvmsg(),而父进程应使用 sendmsg() 复制并“向下传输”所需的文件描述符 - 请参阅 here

【讨论】:

  • 这正是我最终做的事情
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2013-04-12
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 2017-01-25
相关资源
最近更新 更多