欢迎来到天天文库
浏览记录
ID:37407838
大小:2.07 MB
页数:55页
时间:2019-05-23
《第8章、进程间通信》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、《嵌入式Linux应用程序开发标准教程》——第8章、进程间通信嵌入式学院—华清远见旗下品牌:www.embedu.org《嵌入式Linux应用程序开发标准教程》——第8章、进程间通信第8章进程间通信本章目标在上一章中,读者已经学会了如何创建进程以及如何对进程进行基本的控制,而这些都只是停留在父子进程之间的控制,本章将要学习不同的进程间进行通信的方法,通过本章的学习,读者将会掌握如下内容。掌握Linux中管道的基本概念掌握Linux中管道的创建掌握Linux中管道的读写掌握Linux中有名管道的创建读
2、写方法掌握Linux中消息队列的处理掌握Linux共享内存的处理嵌入式学院—华清远见旗下品牌:www.embedu.org《嵌入式Linux应用程序开发标准教程》——第8章、进程间通信8.1Linux下进程间通信概述在上一章中,读者已经知道了进程是一个程序的一次执行。这里所说的进程一般是指运行在用户态的进程,而由于处于用户态的不同进程之间是彼此隔离的,就像处于不同城市的人们,它们必须通过某种方式来进行通信,例如人们现在广泛使用的手机等方式。本章就是讲述如何建立这些不同的通话方式,就像人们有多种通信方
3、式一样。图8.1进程间通信发展历程Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同。前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“systemVIPC”,其通信进程主要局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。而Linux则把两者的优势都继承了下来,如图8.1所示
4、。nUNIX进程间通信(IPC)方式包括管道、FIFO以及信号。nSystemV进程间通信(IPC)包括SystemV消息队列、SystemV信号量以及SystemV共享内存区。nPosix进程间通信(IPC)包括Posix消息队列、Posix信号量以及Posix共享内存区。现在在Linux中使用较多的进程间通信方式主要有以下几种。(1)管道(Pipe)及有名管道(namedpipe):管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。(2)信号
5、(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。(3)消息队列(MessgeQueue):消息队列是消息的链接表,包括Posix消息队列SystemV消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。(4)共享内存(Sharedmemory):可以说这是最有用的进程
6、间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。嵌入式学院—华清远见旗下品牌:www.embedu.org《嵌入式Linux应用程序开发标准教程》——第8章、进程间通信(5)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。(6)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。本章会详细介
7、绍前5种进程通信方式,对第6种通信方式将会在第10章中单独介绍。8.2管道8.2.1管道概述本书在第2章中介绍“ps”的命令时提到过管道,当时指出了管道是Linux中一种很重要的通信方式,它是把一个程序的输出直接连接到另一个程序的输入,这里仍以第2章中的“ps–ef
8、grepntp”为例,描述管道的通信过程,如图8.2所示。图8.2管道的通信过程管道是Linux中进程间通信的一种方式。这里所说的管道主要指无名管道,它具有如下特点。n它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之
9、间)。n它是一个半双工的通信模式,具有固定的读端和写端。n管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read()和write()等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内核的内存空间中。8.2.2管道系统调用1.管道创建与关闭说明管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fds[0]和fds[1],其中fds[0]固定用于读管道,而fd[1]固定用于写管道,如图8.3所示,这样就构成了一个半双
此文档下载收益归作者所有