在儿童完成一个exec之后与子进程共享文件描述符表

问题描述:

是否有任何方法可以创建一个新的进程,即使在exec之后也共享文件描述符表? clone(CLONE_FILES)将无法​​正常工作,因为人网页显示:在儿童完成一个exec之后与子进程共享文件描述符表

如果一个进程共享一个文件描述符表调用的execve(2),其文件描述符表被复制(非共享)。

+2

这里有什么目标呢?为什么你需要一个实时共享的文件描述符表副本,一旦进程停止,即使是相同的可执行文件?乍一看似乎无意义,所以我怀疑这可能是[XY问题](https://meta.stackexchange.com/q/66377/322040)。 – ShadowRanger

+1

@ShadowRanger我正在为Linux编写一个x86用户模式模拟器,并通过在模拟器的同时在ptrace下运行一个真实进程并对每条指令的CPU状态进行比较来测试它。当模仿一个mmap调用的时候,我想把父母使用的FD和覆盖edi的东西用在孩子身上。不是一个很常见的用例,这是肯定的。 – tbodt

+0

即使'execve()'之后未打开的文件描述符被共享,打开的文件描述仍然是共享的 - 是的,确实存在描述符和描述。阅读['open()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html), ['dup2()']的POSIX规范(http://pubs.opengroup (''fork()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fork.html), ['execve() '](http://pubs.opengroup.org/onlinepubs/9699919799/functions/execve.html)。 –

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

子进程应该创建AF_UNIX插座,并在其上recvmsg(),而父进程应该重复和“流下来”所需的文件描述符使用SENDMSG() - 见here

+0

这正是我最终做的 – tbodt