【问题标题】:create pipe after fork() and exec()在 fork() 和 exec() 之后创建管道
【发布时间】:2012-10-25 21:39:48
【问题描述】:

考虑以下几点:

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

我的程序应该如下工作:

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

问题是:

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

有什么想法吗?

编辑:

伙计们,

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

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

【问题讨论】:

    标签: c exec fork pipe


    【解决方案1】:

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

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

    http://gitorious.org/libancillary/libancillary

    这里是来源:

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

    当然,您必须调整它以适应您的要求。

    【讨论】:

    • 正如我所说,我的子进程是一个服务器,如果收到某些消息,那么它应该为他的父进程创建另一个管道
    • 改变你的工作流程。在 fork 之前创建管道,并且只有在收到消息时才发送数据。
    • 我不知道有多少客户端连接到服务器,服务器必须为每个客户端有一个管道
    • 正常情况下,父节点是服务器,它产生一个子节点来处理每个客户端连接,而不是反过来。为什么需要在孩子的服务器?
    • 这是我的操作系统作业,我的问题是可以在子进程和父进程之间创建管道吗?实际上,我知道命名管道是我最后的解决方案,
    【解决方案2】:

    有一种方法可以将文件描述符从子进程发送到父进程:你还没有说如何你试图这样做,所以我不能说为什么不适合你。

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


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

    【讨论】:

    • MAINPIPE 是在父进程中创建的管道,通过此管道可以进行父子通信,当子(服务器)接收到特定消息时,我在子进程中创建管道并将文件描述符传递给父进程, 但是,当父级想从 newpipe 读取时,它会得到“错误的文件描述符”错误消息
    • @user1711001 但是您如何将文件描述符传递给父级?您只是将整数写入已经存在的管道吗?那是行不通的,管道只处理数据传输。
    • @nos 是的,我只是将文件描述符整数写入 MAINPAIPE 和父级读取,你能解释一下为什么它不能在单独的答案中工作吗?谢谢,
    • @user1711001 管道如何知道您编写了一个恰好代表文件描述符的 int 而不是您所写的其他 int。计算出一个平方,但碰巧与作为文件描述符的 int 具有相同的值?管道旨在传输数据,而不是文件描述符 - 管道不知道也不关心您传输的是图像、文本行还是恰好与文件描述符相同的数字。
    • @nos 我使用我自己的格式,例如,当子进程创建一个新管道时,使用此格式通过 MAINPIPE 向父级发送消息=>“NEWPIPE 10 11”,其中 10 是读取端,11 是写结束。当以这种格式在父级中接收消息时,父级知道 10 && 11 是文件描述符 ...
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-06
      • 2017-08-06
      • 2011-01-26
      • 1970-01-01
      • 2012-01-23
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多