Linux管道通信浅析

来源 :数字化用户 | 被引量 : 0次 | 上传用户:qvwen2005
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘 要】在Linux下,由于处于用户态的不同进程之间是彼此隔离的,它们必须通过某种机制来进行通信。Linux平台下提供了多种进程通信方式,如管道、信号量、消息队列等,本文主要研究了Linux环境中的管道通信的实现机制,探讨无名管道和有名管道的工作方式,及相应的创建和使用的方法。
  【关键词】Linux、进程通信、管道
  一、管道实现机制
  我们把从一个进程连接到另一个进程的数据流称为 “管道”,这是最早的Linux进程间通信机制之一。在Linux中管道常作为一种特殊文件处理。实际上,管道是内核中一個固定大小的缓冲区,它按先进先出的方式进行数据传输,一个进程向管道中写的内容会被管道另一端的进程读出。每次写入的内容都添加在管道缓冲区的末尾,且从缓冲区的头部读出数据,读写的位置自动增加,并且从管道读数据是一次性操作,数据一旦被读,便从管道中被抛弃。在缓冲区写满时,则由相应的规则控制读写进程进入等待队列,当空的缓冲区有写入数据或满的缓冲区有数据读出时,就唤醒等待队列中的读写进程继续读写。
  管道分无名管道和有名管道。无名管道没有文件名,也没有磁盘节点,仅作为一个内存对象存在,用完后便销毁。无名管道没有显式的打开过程,实际上它在创建时就自动打开了,故只能由有亲缘关系的两个进程间通信使用。而有名管道克服了无名管道没有名字的限制,可由任意两个或多个进程间通信使用,它的使用方法和普通文件类似,都遵循打开、读、写、关闭的过程,只是读写的内部实现和普通文件有所不同。
  二、无名管道
  (一)无名管道创建
  int pipe(int fd[2])在Linux中可以通过系统调用建立管道。当一个管道建立时,会创建两个文件描述符fd [0]和fd [1],其中fd [0]固定用于读管道,fd[1]固定用于写管道,如图1所示,这样就构成了一个半双工通道。
  由于管道用于不同进程间通信,而调用pipe()创建的管道两端处于一个进程中,这在实际应用中没有太大意义。因此,通常先是创建一个管道,再通过调用fork()函数创建子进程,该子进程会继承父进程所创建的管道,这时,父子进程就可以共享该管道。管道的文件描述符对应关系如图2所示。此时关系看似非常复杂,实际上却给不同进程之间的读写创造了很好的条件。父子进程分别拥有自己的读写通道,为了实现父子进程之间的读写,只需把无关的读端或写端文件描述符关闭即可。如在图3中将父进程的写端fd[1]和子进程的读端fd[0]关闭,此时,父子进程之间就建立起了一条“子进程写入父进程读取”的通道。反之,亦如此。
  (二) 无名管道读写操作
  创建完管道后,便可以调用I/O函数,如close、read、write等函数,对管道进行读写了,但注意与普通文件读写还有一定区别。
  1.从无名管道中读取数据。如果管道写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;
  当管道写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节数目不大于PIPE_BUF,则返回管道中现有数据字节数或返回请求的字节数。
  2.向无名管道中写入数据。向管道中写入数据时,Linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,则写操作将一直阻塞。
  三、有名管道
  有名管道建立在实际的磁盘介质上,有自己的名字,它以FIFO的文件形式存在于文件系统中。故即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信。
  (一) 有名管道创建
  int mkfifo(const char * pathname, mode_t mode)
  该函数的第一个参数是路径名,即创建后FIFO的名字。若该参数是一个已经存在的路径名时,会返回EEXIST错误,故在调用mkfifo函数前最好先检查FIFO是否已经创建。
  第二个参数与open()函数中的mode参数相同。如果程序在打开FIFO时指定了只读/只写方式,则该进程对于打开的FIFO就是一个读端/写端。如果指定的是读写方式,进程既是读端又是写端。
  (二) 有名管道的打开
  无名管道在创建时自动打开,但有名管道在使用时必须调用open()打开。因为无名管道有两个文件数据结构:对应的VFS索引节点及共享数据页,在进程每次运行时都会创建一次,而FIFO一旦创建便一直存在。
  对管道使用open()时可能会引起阻塞。若同时用读写方式(O_RDWR)打开,则不会引起阻塞;若用只读方式(O_RDONLY)打开,则open()会阻塞一直到有写方打开管道, 除非指定了非阻塞方式(O_NONBLOCK)打开;若以只写方式(O_WRONLY)打开也会阻塞到有读方打开管道。
  (三) 有名管道的读写
  对有名管道的读写可以直接调用read()、write()函数实现,但在管道的读写中可能有阻塞情况,我们可以在open()函数中设定非阻塞标志(O_NONBLOCK)。
  1.从FIFO中读取数据。如果有进程写打开FIFO,且当前FIFO内没有数据,则对设置了阻塞标志的读操作将一直阻塞。对没有设置阻塞标志读操作来说则返回-1。对设置了阻塞标志的读操作来说,造成阻塞的原因有两种:当前FIFO内有数据,但有其它进程在读这些数据或是FIFO内没有数据。解阻塞的原因则是FIFO中有新的数据写入。
  2.向FIFO中写入数据。对于设置了阻塞标志的写操作,当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性,若此时管道空闲缓冲区不足以容纳要写入的字节数,则进入睡眠,直到缓冲区中能够容纳要写入的字节数时,才开始进行一次性写操作;当要写入的数据量大于PIPE_BUF时,Linux将不保证写入的原子性,FIFO缓冲区一有空闲区域,写进程就会试图向管道写入数据。
  对于没有设置阻塞标志的写操作,当要写入的数据量大于PIPE_BUF时,Linux不保证写入的原子性,在写满所有FIFO空闲缓冲区后,写操作返回;当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性,若当前FIFO空闲缓冲区能够容纳请求写入的字节数,写完后成功返回;如果当前FIFO空闲缓冲区不能够容纳请求写入的字节数,则返回EAGAIN错误,提醒以后再写。
  四、 结束语
  管道是Linux平台下最有特色的IPC方式之一,本文介绍了Linux中管道的实现机制,并详细讨论了无名管道和有名管道的创建及使用方法,指出无名管道用于亲缘关系的进程,而有名管道则可用于任何进程之间。
  参考文献:
  [1] 乔静等,Linux两种管道通信方式分析及对比,电脑知识与技术,V01.6,No.24,August 2010
  [2] 周超,董军军,Linux进程管道通信的研究,电脑开发与应用,2008(1)
  [3] 杨水清等,ARM嵌入式Linux系统开发技术详解,北京:电子工业出版社,2008
  [4] DanielP. Bovet等, 深入理解Linux内核, 中国电力出版社, 2008
  作者简介:高霞,女,1980年11月,湖北十堰,武昌理工学院信息工程学院讲师,嵌入式方向
其他文献
【摘 要】本文介绍了利用.NET技术开发垂直搜索引擎的基本原理,分析了.NET架构下垂直搜索引擎的特点和相关技术,并提出了基于.NET进行垂直搜索引擎开发的过程和方法。  【关键词】NET 垂直搜索引擎;  一、引言  随着互联网技术的不断发展,使用互联网获取信息是现阶段人们取得信息的主要方式之一。在使用搜索引擎的检索信息时,人们希望结果能够更加专业,能符合自己的定向需求,这些新的需求给搜索引擎技
目的:阐明特发性膜性肾病(IMN)的分子病理特征,探讨分子病理分型在IMN发病机制研究以及指导临床治疗和判断预后中的作用。 方法:21例经肾穿刺活检及临床诊断为IMN患者肾组织
【摘 要】本文主要介绍了基于51单片机为核心的LED点阵显示屏控制系统的设计,在对LED点阵显示屏做了简单介绍的基础上,详细阐述了LED点阵显示屏的控制系统的主要框架结构,通过译码电路和驱动电路来完成显示屏的控制和数据传输,同时根据控制系统的主体结构框架,对系统的控制流程进行设计,从而完成LED点阵显示屏的信息的显示。  【关键词】51单片机;LED点阵显示屏;译码电路;驱动电路;数据显示  一、
为实现公司仓储资源的统筹利用和优化配置,推进物资全寿命周期管理建设,改变长期以来分散管理的格局,通过建立公司仓储资源管控机制、建立物资公司中心仓库、实施公司区域库及周
【摘 要】本文指出完善政府采购制度的重要意义,及我国政府采购制度发展现状和存在的问题,进而提出应通过健全政府采购法律制度、建立政府采购管理体系和完善政府采购监督体系等措施,建立和完善我国的政府采购制度。  【关键词】政府采购制度 政府采购法律制度 政府采购管理体系 政府采购监督体系  一、政府采购中存在的问题  我国政府采购工作还处于发展阶段,还存在许多要解决的问题。主要体现在以下几个方面:  (
【摘 要】伴随着信息网络的高速发展人们迎来了信息化的时代,人们的生活更加的智能化,在此基础上产生了智能家居控制系统。本文通过对智能家居的概念解析、發展过程以及嵌入式技术概念及应用来具体阐述嵌入式技术在智能家居系统中的应用。  【关键词】智能家居;嵌入式技术;语音识别;智能化控制  一、前言  1980年在室内设计领域人们开始提出“智能家居”的构想[1],该构想提出之初只是为实现对住宅内部的监控与管
沟通,在信息通信技术领域中是一个很重要的组成部分。本文通过对ICT领域中的企业架构、IT战略、ERP系统、IT治理、项目管理等方面的分析,并结合华东政法大学为例,讨论沟通的重要
期刊
【摘 要】三网融合不只是广播电视网、电信网、计算机网的物理融合,更多的是高层业务的融合。目前,三网融合技术已经成熟,被广泛应用于金融、证券、保险、政府、电力、教育等行业。对于高校建设的无线校园网来说,主要完成语音,视频和数据的承载,实现手机Wi-Fi上网看视频,电视上网,网络通话等业务.  【关键词】三网融合;无线校园网  一、无线校园网络的设计原则  校园网是一个基于校园学习、生活、娱乐、游戏、
【摘 要】提出基于模拟退火算法的WLAN组网信道选择算法,仿真结果表明采用此算法进行信道选择是行之有效的。  【关键词】模拟退火算法 信道选择  一、引言  无线通信技术为人们生活带了便利和高效率。作为传统有线网络的一种替代方案和延伸,无线通信技术用无线空口替代网线,把人们固定有线接入解放出来,随时随地方便的获取信息和提供娱乐。随着智能手机和Pad的大规模普及,基于移动智能终端的数据业务爆发式增长
【摘 要】智能电网并非只是为了展示先进的技术,或者仅是着眼于某种局部问题的解决方案,它实质上是以先进的计算机、电子设备和高级元器件等作为基础,通过引入新的通信、自动控制和其他信息技术,从而实现对整个电力网络的升级改造,最终达到电力网络运行更加可靠、经济、环保这一根本目标。智能电网选择MIMO技术作为主要的通信方式,具有很多优势同时也是一种必然趋势。它不仅仅可以实现资源共享,减少资源重复建设带来的损