【问题标题】:Is the pipe '|' in shell the ordinary pipe?是管道'|'在壳普通管道?
【发布时间】:2018-07-13 11:54:39
【问题描述】:

在操作系统概念(Avi Silberschatz,第 9 版)的第 145 页上,它指出

请注意,普通管道需要 UNIX 和 Windows 系统上的通信进程之间的父子关系。这 意味着这些管道只能用于 在同一台机器上处理。

但是,当我在 linux 机器上执行命令 ps -el | grep 0 时,进程 ps 和 grep 都将 bash 作为其父进程。其他资源确认壳管是单向的普通管道。如果需要父子关系,那么bash下的ps和grep进程怎么是同级的呢?只是为了确认我对管道的理解,教科书中的陈述是完全错误的还是我在这里误解了什么?

【问题讨论】:

  • 抱歉,但投票结束:“要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于堆栈溢出,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,描述问题以及迄今为止为解决该问题所做的工作。”。换句话说,* 是为了帮助人们修复他们的编程代码。在发布更多问题之前,请阅读*.com/help/on-topic*.com/help/how-to-ask*.com/help/dont-ask*.com/help/mcve。 Tnx

标签: unix operating-system pipe


【解决方案1】:

该陈述是正确的,但必须与描述符继承混合进行解释。这意味着要设置管道,您需要父子关系,而不是只能在父子之间进行与管道的通信。因此,在您的情况下, bash 创建管道并将其传输给子 ps 和 grep (一个在其中写入,而另一个在其中读取)。因此,两个孩子都与他们的父母创建的管道进行通信。

【讨论】:

  • 感谢您的回复!我想如果我们可以在两个独立进程之间共享管道描述符,我们可以在它们之间创建一个“普通管道”,但这将重新发明命名管道。