免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: bill0831
打印 上一主题 下一主题

UNIX中的FIFO管道的问题 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
11 [报告]
发表于 2003-08-01 00:15 |只看该作者

UNIX中的FIFO管道的问题

我说的普通就是半双工无名管道
这里的FIFO就是有名管道。

大多数的unix系统中,这两种管道的数据传输都不是通过磁盘文件系统来进行的,只有极少数的posix标准的unix采用了文件系统磁盘交互信息的方式。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
12 [报告]
发表于 2003-08-01 00:44 |只看该作者

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是个特殊的文件,像设备文件一样,但是和文件系统天生存在关系。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
13 [报告]
发表于 2003-08-01 01:02 |只看该作者

UNIX中的FIFO管道的问题

为了能够彻底的理解fifo,那么需要了解普通的管道,也就是五名管道。

如下不作特殊说明的时候,管道一词就是指五名管道。

一个管道是个无形的存在于内存中的文件。但是需要一个文件系统地inode结构,还需要两个文件号(因为是两个端)。事实上创建管道的过程类似与创建文件。再linux中,是通过get_pipe_inode来村文件系统中获得inode号。同时通过pepe_new来分配一个内存叶面当作缓存区,这个内存页面的大小的一个限制(包括软件和硬件两个部分)从应用的角度看,表现在PIPE_BUF。

用于管道的这个文件实际上只是作为缓存的内存叶面,只不过用了文件系统的机制来管理而已,再linux内河中,函数get_unusal_fd()便是用来分配一个打开文件号,并且让这个管道叶面和文件系统挂钩。

从内核的角度看,管道既然用文件系统的机制,那么必然需要一个文件目录项,在linux中,是通过d_alloc()来分配目录项的,然后把inode的指针指向这个目录项的一个成员。

作为管道,一旦创建成功,应用除了传递数据外,能够做的只有删除操作了。再linux中,看看函数指针对应的操作pipefs_dentry_operations便知道缘由。

作为一种理解,管道绝对不等同于一个文件系统的文件,因为除了文件系统的一些特征外,还有自己独有的成分。这个成分的定义再linux中表现为pipe_fs_type。有兴趣的刻意去自己查找这个类型的定义。顺便说一句,这个特殊文件系统在系统启动的过程中编mount到系统中,这个过程可以参看内河启动的过程,函数名称好像叫做kern_mount,我记得不是很清楚了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
14 [报告]
发表于 2003-08-01 01:03 |只看该作者

UNIX中的FIFO管道的问题

FIFO关联的东西更多,有时间再写吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP