l_》鬏0G歉A氛蓬i。AN秘UAa黔
UnU父进程间的管道通信 i
杜 楠
摘 要 Ljnux平台下允许多进程编程,而进程间通信的方式很多,比如像管道、消息队列、
共享变量等都是常用的技术,其中以管道通信最能体现Linux平台的特色,所以
本文以Linux平台下的管道通信为重点进行讨论。
关键词 父进程,子进程,管道,文件描述符
一、管道的概念
从图l中可以清楚地看出,进程和管道是如何通过句柄进
行数据交换的。进程通过句柄fd[O】向管道写人(write)数据,同
什么是管道?简单地说,管道就是连接一个程序的输出和
时通过fd[1]从管道读出(read)数据。联想到UNIX的文件处理,
另一个程序的输入的单向通道。在UNIX系统的各种通信方法
事实上,在系统内核中,每个管道都是用一个inode结点来表示
中,它是最古老而又最为广泛的一种(特别是在shell中)。
的。当然,这个结点是看不到的,它只存在于系统内核中。
#ls—lImore
这里建立了这样的一个管道:获取ls—l的输出,再将它作
为more命令的输入。形象地说,就是数据沿着管道从左边流到
了右边。
这个例子并不复杂,只要对UNIx比较熟悉的人都曾经使
用过类似的命令。但是,在简单的命令下,uNIx内核究竟都做
了一些什么呢?
当进程创建一个管道的时候,系统内核同时为该进程设立
了一对文件句柄(一个流),一个用来从该管道获取数据(read),
另一个则用作管道的输出(write)。(图1)显示了进程和管道间
的相互作用。
系统内核
,l句柄fd[o】Ie
I句柄fd[1]I
-=己
进
程
图2
fbrk函数调用后的管道
系统内核
句柄fd[o】k
l甸柄fd[1]
J
进
程
父
进
程
父
进
程
图1
图3关闭了相应句柄的管道
万方数据
赫赫器塞遵j
鬻鬻雾章I嚣藤麟壤
蒸程语言
轳疆0《;德A黼轧AN《;&。;矗《j懿
当然,一个管道只被用来同单个进程通信是没有意义的,建
立一个同自己通信的管道是没有用处的。为了解决这个问题,
在主进程中用fork函数创建一个自身的子进程,因为子进程继
承父进程打开的所有文件句柄。利用继承的句柄,就可以实现
父/子间的通信了。这个关系可以用图2来描述。
二、管道的建立和使用
1.管道的创建pipe函数
函数原要4:#include
in‘pipe(int pfd[2]);
调用成功时,返回值为0;错误时,返回一1,并没置错误代
码errno。创建一个管道,pfd[0]和pfd[1]分别为管道两端的文件
描述字,pfd【0】用于读,pfd[1]用于写。
2.写管道write函数
ret=write(pfd[1],buf,n)
若管道已满,则被阻塞,直到管道另一端read将已进入管
道的数据取走为止。
管道容量:某一固定值,如8192字节
3.读管道read函数
ret=read(I)fd[0],buf,n)
若管道为空,且写端文件描述字未关闭,则被阻塞。
若管道写端已关闭,则返回O。
若管道不为空,分两种情况:(设管道中实际有m个字节),
如n≥m,则读m个;如果nps.txt
awk(printf(”%s%s%s\n”,$1,$2,$3):)Os2.txt
程序的运行结果相当于运行了以上三条命令,即ps以长格
式将当前所有用户进程信息输出重定向到ps.txt文件,awk文
本处理命令从ps.txt输入重定向(只打印前3个参数)并作为
son命令的管道输入,命令sort将最终结果输出重定向到文件
int pfd【2】:
ps2.txt。
电■鳙褪笈掰与毒鹣
万方数据
2005.2
ii≯I i。j
I 鬣鬻甓一毯稳骶巍
编程语言
轳壤0G辣A黼i,ANG"A《、疆?
样incIude
#inClude
捕nclude
#inClude
int maini)
{
int fdl=一1,fd2=一1:fdl是ps.txt的描述符:fd2是
ps2.t×t的描述符
int fdf2】,sv:
定义管道
pipeffd):
建立管道
进程一:ps—ef输出重定向到ps.txt
if(fork()==O){
fdl;open{“ps.t×t’,O-J:REATlO.j~RONLY)
dl_:lp2({d1,¨:
close(fdl):
e×ecIp《4ps4,’ps。,”一ef’,O}:
)else if(fork()==O)
进程二:从管道重定向输出到ps2.txt
{
dup2(fdfO】,O):
cIose《fdl01):
close(fd【1 1):
fd2=open(”ps2.txt”,O_CREATl0驯RONLY):
dup2(fd2,1):
cIose{fd2):
eXeclp{’sort’,”sort4,0):
)
eise i}f{foIIIc{)==0)l
进程三:awk从ps.txt重定向输入管道
duD2lfd【11.1):
closef_f:cIl01}:
eloS引{fl=I∽1):
fd’=openI 4ps。t]lcc。,O璺DoN;l__丫》:
dup2{fdl,Qk
c}ose{fd¨:
execIp{’awk”,’awk。,’{pr|ntf(\”%s%s %s\\n\。,
射,$2。$3j}。。0}:
)
elose(托f01);cIosefl{dfl m
wa}t《&sv):wajt{&svk wa裢(&sv}i卜
以上程序在Red Hed 7.0平台下全部调试通过。
五、几个问题
1.管道传输的是一个无记录边界的字节流
写端一次write所发送数据,读端可能需多次read才能读
取。也有可能写端的多次w“te所发送的数据,读端read一次就
全部读出。
2.父子进程需要双向通信时,应采用两个管道
父子进程只使用一个管道双向数据传送时的问题,如果用
一个管道,进程可能会收到自己刚写到管道去的原始数据,增
加其他同步方式太复杂。
3.父子进程使用两个管道传递数据,有可能产生死锁
父进程因输出管道满而写,导致被阻塞,子进程因要向父进
程写回足够多的数据而导致写也被阻塞,这时死锁。
4.管道的缺点
没有记录边界。
多进程通信问题必须仔细分析流量控制和死锁问题。
参考文献
UNIX操作系统原理.清华大学出版社
(收稿日期:2004年4月15日)
,一一一一一一一一一一一一一一一一”一一”一一一、
;正阳为美国保健系统管理软件完成web迁移i
正阳软件及其全球战略合作伙伴美国Svbase会同
美国
RES—Q(r)Healthcare System公司于日前在加利福尼亚州
共同
宣布,在正阳网络迁移开发产品Appeon for PowerBuilder
助F,美国主流保健系统——RES—Q保健系统中的主要
的帮
功能
模块已经成功的迁移到基于J2EE框架的Web上。而完成
这些
主要模块的Web迁移仅花费一个工程师一个月的时间。
迁移
后的Web系统使得各医院数万的医护人员如今仅通过上
能了解到自己的日程安排。这大大的提高了医院工作人
网就
员的
效率以及灵活性。
RES—Q保健系统的主要功能模块包括员工配置、时
间安
排、个人信息管理,是典型的用Sybase的PowerBuilder开
发的
客户端/服务器端应用。通过大量使用Sybase的DataWi
ndow
技术,该系统提供了强大的时间安排、个人信息管理、人员
工作
2量安排、各部门人力预算的能力。该应用的主要窗体集中于:
:
正阳软件具有革命性意义的web开发平台一Appeon衙:
2时问安排以及个人信息管理两个关键的模块。
;
:PowerBuilder,能自动将应用95%对象以及代码发到基于J2EE:
2架构的web上去,而剩余的5%的工作完全只需要一个工程师:
;25天的时间来完成。同样的应用如果用J2EE来重写这些功;
:能模块,需要18个工程师一起工作l一个月的时间,也就是说:
2完成同样一件事情用J2EE来重写代码比用APB要多花18倍:
;的时间。
i
“没有比这更快的将PB应用移到web和Java的方法了”:
:
2 REs—Q的首席执行官Michael Meisel这样说道,“正阳:
2(Appeon)的产品领先于其它为IsV提供服务的J2EE网络开发:
;工具。”
i
:
发布后的web应用精确地复制了原c/s应用的丰富的uI:
2界面,以及原应用强大的Datawindow的功能。既提高了医院:
j以及保健业者的工作效率,又缩减了培训人员熟悉应用的费i
2用。
:
~k。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。一
万方数据
积“藿嚣警蠢妒≤影
Linux进程间的管道通信
作者:
作者单位:
刊名:
杜楠
英文刊名:
年,卷(期):
引用次数:
参考文献(1条)
电脑编程技巧与维护
COMPUTER PROGRAMMING SKILLS & MAINTENANCE
2005,(2)
0次
1.UNIX操作系统原理
相似文献(5条)
1.期刊论文 彭岚.周启海 UNIX并发服务器及其几种优化改进方案 -计算机应用2004,24(4)
从分析UNIX并发服务器的工作方式和过程入手,提出了并发服务器存在的几点不足,由此给出了几种优化改进方案.在这些方案中,基于UNIX套接字对
的优化改进方案是一种较为理想的方案.文中最后给出了这种方案的一个应用实例框架.
2.学位论文 何小平 Linux系统多进程服务器软件技术的研究与实现 2008
随着国内网络应用的发展,越来越多的企业认识到除了要依靠网络设备本身和网络架构的可靠性之外,网络管理是一个关键环节。结构越来越复杂
和规模越来越大的网络系统,需要网络管理软件来保证系统的正常运作,网络管理的质量会直接影响网络的运行质量,管理好一个网络与网络的建设同
等重要。本文结合武汉某信息公司开发的网络性能管理系统,讨论了Linux系统多进程服务器软件的一些通用技术和该系统的技术背景、产品需求、软件
架构以及具体实现,主要包括以下几个方面: 1.给出了网络性能管理系统的产品定义,介绍了产品的目标用户群。分析了系统的网络拓扑结构和
软件层次结构,并按层次描述了系统的功能需求。 2.根据网络管理的目的,介绍了目前主流的网络管理协议SNMP、NetFlow、sFlow的基本原理、
适用范围及它们各自的优缺点,重点介绍了NetFlow不同的数据格式。 3.探讨了网络性能管理系统的需求,着重论述了基于NetFlow采集系统需要
实现的众多功能,包括网络元数据的采集、转化和存储以及系统保障性需求。分析了系统需求中的难点,研究了Linux平台下多进程编程技术,并对各种
进程通信手段进行了比较。另外,为实现系统中海量数据的高效处理和存储,专门研究了嵌入式数据库Berkeley DB。 4.论述了系统的开发环境
和极限编程开发模式在系统开发过程中的运用。根据系统的需求,阐述了NetFlow采集程序flowd的基本设计思想,即父进程接收网络元数据、多个子进
程处理和存储数据,以及系统中父子进程各自的功能。 5.本文的创新之处是在最后一章中,主要对如何利用多进程服务器软件技术实现系统的功
能做了详细的说明。首先论述了网络元数据的采集、系统单一副本运行的实现;系统初始化及退出清理的实现,并以此展示共享内存和消息队列在系统
中的具体运用;重点说明如何利用Unix域套接字实现父子进程间的心跳机制。最后介绍了如何运用锁机制实现多进程下Berkeley陷的打开关闭操作。
3.期刊论文 仲光亮 如何实现Windows子进程使用父进程中的文件句柄 -电脑编程技巧与维护2006(7)
A微软的Windows系列操作系统中,子进程和父进程相对于UNIX系列操作系统的子进程和父进程的关系来说,Windows中子进程和父进程之间是相互独立
的.
4.期刊论文 赵荣彩 TCP Server的动态线程POOL技术研究 -计算机科学2002,29(8)
一、引言 在传统的Unix系统下,当一进程需要另一实体去完成某一子任务时,它就创建一个子进程进行处理.多年来,在U-nix系统下的大多数支持并
行访问的网络Server都是按这种模式设计和运行的,当父进程接受到来自网络的一个Client的连接时,它就fork一个子进程,并由该子进程去处理这个
Client的请求.这种方法存在两个问题:
5.学位论文 卜俊伟 Linux内存管理和进程调度的实时化研究与改进 2006
随着计算机,网络和通信技术地发展,实时系统越来越多得被应用于工业控制、网络通信、实时监控,多媒体等领域。这些新的实时网络应用的出
现给实时系统地发展提出了新的要求和挑战。同时,随着开源项目的兴起,作为典型代表的Linux得到了迅速普及和发展,已成长为稳定的、性能优秀的
操作系统。但是Linux本身是一个只是一个类UNIX的通用的操作系统,其在实时性能方面有着比较大的缺陷。然而基于Linux本身的特点,将其改造成为
一个合适的实时系统是完全可行的。 论文在深入分析和研究Linux2.4版本内核源代码的基础上,结合实时操作系统的原理.选择了对Linux在内存
管理和进程调度这两方面进行研究和实时化改进,取得了显著的效果。 首先通过对内核代码的分析,了解到Linux的内存管理是采用了虚拟内存管
理的方式,使得系统中的每个进程可以使用比实际内存多很多的虚拟内存,提高了系统内存的使用效率。但正是由于虚拟内存的存在,使得进程每次获得
的内存都是先分配虚拟内存,在分配物理内存。系统对物理内存的分配总是会放在最后一步,即在相关指令执行的时候才进行,而且也仅将进程所需要
的部分内存分配给进程。当进程所需要的页面不在内存时,系统会发生缺页中断,将进程所需的页面调入内存,而这个中断时间是不确定的,那么就必
然不能满足实时进程的需求,又考虑到虚拟内存的强大功能,在不删除虚拟内存结构的情况下,针对实时进程采用一次将实时进程所需的内存全部分配
的方法来完成在内存管理这块的改进。同时在研究分析的过程中,发现系统中的空闲内存总量需要放在一个较高的量上才有可能使系统中有足够的内存
可以满足一般实时进程对内存的需求,那么有必要提高系统中空闲内存的数量,从而加快实时进程的响应时间。 由于Linux的进程调度是采用的不
可抢占式的内核调度。其进程调度发生在每次中断发生的时刻,因此要提高Linux在调度方面的实时性,改变时钟中断的粒度是首要工作。适当提高系统
的时间粒度,可以有效地提高系统的实时性。但如果将时间粒度提到无限高,则系统会频繁发生时钟中断,从而严重影响系统性能。其次在进程刚生成
时,Linux让子进程和父进程保持同样的优先级别,不利于系统对实时进程的响应,因此必须要修改进程的优先级,并将实时进程挂在符合其优先级别的
可运行队列中去。 论文中详细阐述了针对Linux操作系统进行的实时化改进方案和具体实施过程,最后对改进后的系统进行了测试,达到了预期的
,平均响应时间只有改进前的40%,系统性能有了大幅度地提高。
本文链接:http://d.g.wanfangdata.com.cn/Periodical_dnbcjqywh200502010.aspx
下载时间:2010年5月4日