1

考虑以下:

  1. 一个有孩子的父进程
  2. 孩子使用 exec 系统调用运行另一个程序
  3. 父子通过双向管道进行通信(命名为 MAINPIPE in rest)
  4. 孩子是端口上的服务器绑定(例如 5000)

我的程序应该如下工作:

如果孩子从客户端收到某个消息,则创建另一个到他的父母的双向管道并发送/接收一些信息。

问题是:

当我在子级(使用)中创建一个管道pipe()并将文件描述符传递给父级(使用 MAINPIPE)时,父级在尝试从管道读取时收到“错误的文件描述符”错误消息。

任何的想法?

编辑:

伙计们,

我的问题不是将在子进程中创建的新管道的文件描述符传递给父级,我已经使用 MAINPIPE 完成了,

但问题是:父进程无法从新管道读取,收到此错误消息“错误文件描述符”,似乎文件描述符在父进程中关闭!

4

3 回答 3

3

在分叉之前创建管道。然后管道在父级和子级中都可用。无需传递文件描述符。

这是一个使用unix 域套接字将文件描述符从子级发送到父级的库的链接:

http://gitorious.org/libancillary/libancillary

这是来源:

http://gitorious.org/libancillary/libancillary/trees/master

当然,您必须对其进行调整以适应您的要求。

于 2012-11-06T00:16:15.367 回答
0

有一种方法可以将文件描述符从子进程发送到父进程:虽然你还没有说你是如何尝试这样做的,所以我不能说为什么它对你不起作用。

请注意,由于您需要一个现有管道来发送文件描述符,因此您可以在单个管道上多路复用多个逻辑流。它可能更容易,更便携。


编辑:您仍然拒绝显示用于将文件描述符从子级发送到父级的代码,但是这个问题包含一些相关的讨论。你能确认你是否在做类似的事情吗?

于 2012-11-06T00:48:32.443 回答
-1

一个文件描述符属于一个进程。在您的情况下,子进程。

传输文件描述符的编号(在您的情况下为 10)不会传输文件描述符本身。它只是传递数字10。数字10在子进程中可以表示文件描述符10,但作为一个文件描述符属于一个进程,它在父进程中是没有意义的。子进程仅在创建时从父进程继承文件描述符。

在创建子节点后打开的任何文件描述符都不会在父子节点之间共享。

如果您需要将实际的文件描述符传递给另一个(例如父)进程,unix 域套接字有这样做的机制,这里的其他帖子包含一些相关链接。

于 2012-11-12T14:11:06.933 回答