我可以在 C 中的 2 个子进程之间使用相同的管道吗?

标签 c linux

好的..所以我正在尝试使用不同的流程..我实际上正在尝试创建 | 如前所述,我已经这样做了,如果我的例子是ls | sort 然后 ls 的 stdout 进入 sort 的 stdin。为此,我只有 1 个管道......但我必须在程序中的某个时刻执行这两个命令,因此我需要 2 个 execvp()。我已经或多或少地学会了如何做到这一点。所以我将尽可能简单地提出我的问题:

我有一个 child 在运行,他的工作是接受ls。在它执行 execvp() 之前,我做了 dup2(pipe1[1], 1) 以便管道的写入端替换标准输出。一旦它执行 execvp(),他就会转到父级,而父级会进入一个辅助方法,该方法的工作是 fork()。这会创建另一个子和父关系.. 并传递一个指向 pipe1 的指针,称为 p1。使用此指针 dup2(p1[0], 0) 将 stdin 替换为管道的读取端。理想情况下,只要我继续这样做,我就可以使用同一个管道 n 次。

这个 child 做了和前一个一样的事情,执行第二个参数sort,然后返回给它的父对象,父对象返回一个标志整数,指向下一个|命令行或 NULL 如果没有则退出。我可以这样做吗?这可能吗?这是我的问题。

我很想发布一些代码,但太他妈长了。我也只是感兴趣,如果理论上我所说的是可能的,那就是通过几个 child 使用同一个管道,如果有一个干净的方法来做到这一点,我想指出它。我知道有更好的方法可以做到这一点,但我想这样做。这不是家庭作业,只是在非递归环境中使用管道的可选工作。谢谢。

最佳答案

你不能复制一个管道,它是一个文件描述符,它是一个有两端的管道。如果您需要更多命名管道,请使用 tee

你不能复制管道意味着你不能从两个进程访问它的一端,管道不能复制它的内容。

关于我可以在 C 中的 2 个子进程之间使用相同的管道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19985492/

相关文章:

c - XMEGA 设置 SPI 并从 LSM330 器件读取 WHO_AM_I_A 寄存器

linux - 直线代码指令导致的开销差异很大

java - Unicode 适用于 Windows 但不适用于 Red Hat Linux : Java

c - 跨过 Emacs GDB

C 中的字符数组初始化

linux - 在 shell 脚本中读取矩阵中的值

linux - 在shell脚本中对时间格式进行排序

linux - 如何使用用户和路径将后缀输入通过管道传递给特定脚本?

单击透明的 xlib 窗口

c++ - Arduino 崩溃并在 "random points"处重新启动