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

标签 c exec fork pipe

考虑以下几点:

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

我的程序应该按如下方式工作:

如果 child 从客户端收到特定消息,则创建另一个双向管道到他的 parent 并发送/接收一些信息。

问题是:

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

有什么想法吗?

编辑:

伙计们,

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

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

最佳答案

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

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

http://gitorious.org/libancillary/libancillary

这是来源:

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

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

关于在 fork() 和 exec() 之后创建管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13242506/

相关文章:

c - 是什么导致小型模块化 C 程序中出现此编译器错误?

c++ - 尽管传入了 PATH 变量,但 execve(...) 不执行程序

c - fork 父/子进程

c - 使用 fork 和 execvp 启动/停止/etc/init.d/中的服务不起作用

c - 我怎样才能让 Doxygen 显示结构而不是类

c - 为什么我们需要将进程的地址空间锁定在 RAM 中?

c++ - 完美实现按位非(~)运算符(翻转位)

c - 使用 find -exec 时出现 exec() 错误

php ffmpeg exec & shell_exec 进程在几秒后停止

linux - 如何绕过 libc 直接调用 fork()?