作者:土人甜层_233 | 来源:互联网 | 2023-01-22 14:04
我想知道为什么管道可以使用的进程之间的关系在Linux API和Bash中是不同的.
在Linux API中,未命名的管道(pipe()
)只能在父子进程之间使用.
在Bash中,可以在两个进程之间使用管道,这两个进程将shell进程作为其共同父进程.
Bash中的管道是否根据Linux API中未命名的管道实现?谢谢.
来自APUE 3ed:
15.2管道
管道是最古老的UNIX系统IPC形式,由所有UNIX系统提供.管道有两个限制.
从历史上看,它们是半双工的(即,数据仅在一个方向上流动).有些系统现在提供全双工管道,但为了最大程度的便携性,我们永远不应该假设是这种情况.
管道只能在具有共同祖先的进程之间使用.通常,管道由进程创建,该进程调用fork,管道在父节点和子节点之间使用.
我们将看到FIFO(第15.5节)绕过第二个限制,并且UNIX域套接字(第17.2节)绕过了这两个限制.
...
15.5 FIFO
FIFO有时被称为命名管道.当共同的祖先创建管道时,未命名的管道只能在相关进程之间使用.但是,对于FIFO,不相关的进程可以交换数据.
Ignacio Vazq..
5
在Linux API中,未命名的管道(pipe()
)只能在父子进程之间使用.
不对.任何具有文件描述符的进程都可以使用它们:父进程,任何子进程,通过域套接字接收它们的任何进程等.
bash中的管道只是儿童与儿童交流的特定情况.
1> Ignacio Vazq..:
在Linux API中,未命名的管道(pipe()
)只能在父子进程之间使用.
不对.任何具有文件描述符的进程都可以使用它们:父进程,任何子进程,通过域套接字接收它们的任何进程等.
bash中的管道只是儿童与儿童交流的特定情况.