考虑以下事项:
我的程序应该如下工作:
如果孩子从客户端收到某条消息,则向其父母创建另一个双向管道并发送/接收一些信息。
问题是:当我在子级中创建管道(使用pipe()
)并将文件描述符传递给父级(使用MAINPIPE)时,父级在尝试从管道读取时会收到“错误的文件描述符”错误消息。
任何想法?
编辑:
人,
我的问题是没有将新管道的文件解析器 - 在子进程中创建 - 传递给父进程, 我已经使用MAINPIPE完成了这项工作,
但问题是:父无法读取新管道,得到此错误消息“坏文件描述符” 似乎在父进程中关闭了文件描述符!
答案 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域套接字有一个执行此操作的机制,此处的其他帖子包含一些相关链接。