在fork()和exec()之后创建管道

时间:2012-11-06 00:12:17

标签: c exec fork pipe

考虑以下事项:

  1. 包含孩子的父进程
  2. child使用exec系统调用运行另一个程序
  3. 通过双向管道进行通信的父母和孩子(休息时名为MAINPIPE)
  4. 子节点是绑定在端口上的服务器(例如5000)
  5. 我的程序应该如下工作:

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

    问题是:

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

    任何想法?

    编辑:

    人,

    我的问题是没有将新管道的文件解析器 - 在子进程中创建 - 传递给父进程, 我已经使用MAINPIPE完成了这项工作,

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

3 个答案:

答案 0 :(得分:3)

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

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

http://gitorious.org/libancillary/libancillary

以下是来源:

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

当然,你必须调整它以满足你的要求。

答案 1 :(得分:0)

有一种方法可以将文件描述符从子进程发送到父进程:你还没有说你是怎么做的,所以我不能说为什么呢不适合你。

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


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

答案 2 :(得分:-1)

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

在您的情况10中传输文件描述符的编号不会传输文件描述符本身。它只传输数字10.数字10可以表示子进程中的文件描述符10,但由于文件描述符属于进程,因此在父进程中没有意义。子进程仅在创建父进程时从父进程继承文件描述符。

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

如果您需要将实际文件描述符传递给另一个(例如父进程)进程,那么unix域套接字有一个执行此操作的机制,此处的其他帖子包含一些相关链接。