预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共41页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

华清远见——嵌入式培训专家http://www.farsight.com.cnQQ:313638714 http://shop.embedu.cn “黑色经典”系列之《嵌入式Linux应用程序开发详解》 第8章进程间通信 本章目标 在上一章中,读者已经学会了如何创建进程以及如何对进程进行基本的控制,而这些都 只是停留在父子进程之间的控制,本章将要学习不同的进程间进行通信的方法,通过本章的 学习,读者将会掌握如下内容。 掌握Linux中管道的基本概念 掌握Linux中管道的创建 掌握Linux中管道的读写 掌握Linux中有名管道的创建读写方法 掌握Linux中消息队列的处理 掌握Linux共享内存的处理 华清远见<嵌入式Linux应用开发班>培训教材 华清远见——嵌入式培训专家http://www.farsight.com.cnQQ:313638714 http://shop.embedu.cn 8.1Linux下进程间通信概述 在上一章中,读者已经知道了进程是一个程序的一次执行的过程。这里所说的进程 一般是指运行在用户态的进程,而由于处于用户态的不同进程之间是彼此隔离的,就像 处于不同城市的人们,它们必须通过某种方式来提供通信,例如人们现在广泛使用的手 机等方式。本章就是讲述如何建立这些不同的通话方式,就像人们有多种通信方式一样。 Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。而对 UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯 克利软件发布中心)在进程间的通信方面的侧重点有所不同。前者是对UNIX早期的进程间 通信手段进行了系统的改进和扩充,形成了“systemVIPC”,其通信进程主要局限在单个计 算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。而Linux 则把两者的优势都继承了下来,如图8.1所示。 ·UNIX进程间通信(IPC)方式包括管道、FIFO、信号。 基于SystemV进程间通信 最初 UNIX的 进程间Linux进程间通信 通信 基于Socket进程间通信 POSIX进程间通信 图8.1进程间通信发展历程 ·SystemV进程间通信(IPC)包括SystemV消息队列、SystemV信号灯、SystemV 共享内存区。 ·Posix进程间通信(IPC)包括Posix消息队列、Posix信号灯、Posix共享内存区。 现在在Linux中使用较多的进程间通信方式主要有以下几种。 (1)管道(Pipe)及有名管道(namedpipe):管道可用于具有亲缘关系进程间的通信, 有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 (2)信号(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信 方式,用于通知接受进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求 效果上可以说是一样的。 华清远见<嵌入式Linux应用开发班>培训教材 《嵌入式Linux应用程序开发详解》——第8章、进程间通信QQ:313638714 http://shop.embedu.cn (3)消息队列:消息队列是消息的链接表,包括Posix消息队列systemV消息队列。它 克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以向消息队列中按照一定 的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。 (4)共享内存:可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块 内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要 依靠某种同步机制,如互斥锁和信号量等。 (5)信号量:主要作为进程间以及同一进程不同线程之间的同步手段。 (6)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于不同机器之间的 进程间通信,应用非常广泛。 本章会详细介绍前4种进程通信方式,对第5种通信方式将会在第10章中单独介绍。 8.2管道通信 8.2.1管道概述 细心的读者可能会注意到本书在第2章中介绍“ps”的命令时提到过管道,当时指出了 管道是Linux中很重要的一种通信方式,它是把一个程序的输出直接连接到另一个程序的输 入,这里仍以第2章中的“ps–ef|grepntp”为例,描述管道的通信过程,如图8.2所示。 进程ps-ef进程grepntp 内核 管道 图8.2管道的通信过程 管道是Linux中进程间通信的一种方式。这里所说的管道主要指无名管道,它具有如下 特点。 ·它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之