- 论坛徽章:
- 1
|
UNIX中的FIFO管道的问题
为了彻底的搞清楚这个问题,我们首先看看unix的发展历史
再unix世界中,有两大阵营对unix做出了杰出的贡献,分别是AT&T和伯克利分校(BSD),管道属于ipc的范围,因此我们看看这两大主力在ipc方面分别作了哪些努力。
AT&T属于务实型的。传统的ipc方式表现出了很多的不足,例如只能局限于存在亲缘关系的进程之间,还有其他的因素。例如考虑到IPC传递的性能问题,AT&T开发了shm。考虑到每个ipc占用一个系统文件号的弊端,开发了System V 所谓的“健值”的方式等等。再AT&T的努力下,才有了今天的SysV ipc机制。
再来看看BSB。就在AT&T忙着在现有的ipc的基础上做手脚的时候,tcp/ip那么时候开始流行起来。BSD抓住了这个机会,第一次将tcp/ip协议的实现加入了unix操作系统中,对于socket来说,除了能够实现tcp/ip而外,还有ipc的功能,类似于有名管道,只不过不这种管道根进一步的推广到了网络中。
看看早期的unix提供的集中可怜的ipc方式,不难理解这两大主力的贡献。
1、pipe
实现依赖于文件系统和内核。并且只能在具有亲缘关系的进程之间。
2、signal
信号也算是一种ipc的机制。通过模拟软中断的方式来实现。但是signal在进程之间通讯必须知道对方的pid,因此受到了很大的限制。
3、trace
和管道一样,trace只能用于父子之间和兄弟之间,并且是单向的。因此很多系统不怎么使用。
由于这样的限制,unix的设计者们试图寻找其他的ipc途径,鉴于管道的思想,人们自然而然的能够想到的是让这个管道有个可疑表示的名字。一旦有了名字,那么其他的进程便可以通过这个名字来访问和使用这个管道,这种思想直接导致了FIFO的出现。
这个FIFO是个特殊的文件,像设备文件一样,但是和文件系统天生存在关系。 |
|