子代在fork之后写入父文件中创build的文件描述符

我有一个父进程,它侦听套接字上的传入连接,并在接受客户端之后,将相关文件描述符和其他date传递给subprocess(通过命名pipe道)。

从这一刻起,孩subprocess将为客户提供服务,父母不断倾听新客户。

我的问题是,当我尝试在subprocess中的文件描述符上写,我会得到一个错误(错误的文件描述符),写入失败。 我的猜测是,因为这些文件描述符是在fork之后创build的,所以child不能简单地使用它们,而只能属于父进程。

那么这是写入失败的原因吗? 是否有任何可能的方式让孩子使用这些文件描述符?


正如洛雷布在答复中提到的那样,以这种方式达到预期的结果是不可能的。 我做了一个临时修复,使用另一个pipe道来指导从孩子到父母的回应。 由于文件描述符属于父节点,它可以通过套接字将响应转发回客户端。

要传递一个文件描述符,你需要AF_UNIX套接字,而不是命名管道。 你需要sendmsg(3),这是非常奇怪的使用,所以你最好在网上查找一些例子 – 例如libowfat中的io_passfd。

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

也许你应该尝试关闭和重新开放这个FD。