没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
64页
目录 深刻理解Linux进程间通信(IPC) 1 Linux环境进程间通信(一) 3 Linux环境进程间通信(二): 信号(上) 19 Linux环境进程间通信(二): 信号(下) 30 Linux环境进程间通信(三) 40 Linux环境进程间通信(四) 52 Linux环境进程间通信(五): 共享内存(上) 63 Linux环境进程间通信(五): 共享内存(下) 73 Linux 环境进程间通信(六) 79
资源推荐
资源详情
资源评论
目录
目录................................................................................................................................................ 1
Linux 环境进程间通信(一)....................................................................................................... 3
Linux 环境进程间通信(二): 信号(上)................................................................................ 20
Linux 环境进程间通信(二): 信号(下)................................................................................ 31
Linux 环境进程间通信(三)..................................................................................................... 41
Linux 环境进程间通信(四)..................................................................................................... 53
Linux 环境进程间通信(五): 共享内存(上)........................................................................ 66
Linux 环境进程间通信(五): 共享内存(下)........................................................................ 76
Linux 环境进程间通信(六)..................................................................................................... 81
深刻理解 Linux 进程间通信(IPC)
郑彦兴 国防科大计算机学院
年 月 日
一 个大型的应用系统,往往需要众多进程协作,进程( 进程概念见附
)间通信的重要性显而易见。本系列文章阐述了 环境下的几种主要进
程间 通信手段,并针对每个通信手段关键技术环节给出详细实例。为达到阐明
问题的目的,本文还对某些通信手段的内部实现机制进行了分析。
序
下的进程通信手段基本上是从 平台上的进程通信手段继承而来的。
而对 发展做出重大贡献的两大主力 的贝尔实验室及 (加 州大
学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。
前者对 早期的进程间通信手段进行了系统的改进和扩充,形成了
“ !"#,通信进程局限在单个计算机内;后者则跳过了该限制,形成
了基于套接口($)的进程间通信机制。 则把两者继承了下来,如
图 示:
其 中,最初 !" 包括:管道、% %&、信号; !" 包括:
消息队列、 信号灯、 共享内存区;! !"
包括: ! 消息队列、! 信号灯、! 共享内存区。有两点需要简单
说明一下:)由于 版本的多样性,电子电气工程协会( ''')开 发了
一个独立的 标准,这个新的 ( 标准被称为计算机环境的可移植
性操作系统界面(!& ))。现有大部分 和流行版本都是遵循 !& ) 标
准的,而 从一开始就遵 循 !& ) 标准;) 并不是没有涉足单机
内的进程间通信($ 本身就可以用于单机内的进程间通信)。事实上,很
多 版本的单机 !" 留有 的痕迹,如 ** 支持的匿名内存映射、
*+ 对可靠信号语义的实现等等。
图一给出了 所支持的各种 !" 手段,在本文接下来的讨论中,为了避免
概念上的混淆,在尽可能少提及 的各个版本的情况下,所有问题的讨论
最终都会归结到 环境下的进程间通信上来。并且,对于 所支持通
信手段的不同实现版本(如对于共享内存来说,有 ! 共享内存区以及
共享内存区两个实现版本),将主要介绍 !! 。
下进程间通信的几种主要手段简介:
管道(!,)及有名管道(-.,,):管道可用于具有亲缘关系
进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管
道所具有的功能外,它还允许无亲缘关系进程间的通信;
信 号(/-):信号是比较复杂的通信方式,用于通知接受进程有某
种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;
除了 支持 早期信号语义函数 /- 外,还支持语义符合
! 标准的信号函数 /-(实际上,该函数是基于 的,
为了 实现可靠信号机制,又能够统一对外接口,用 /- 函数
重新实现了 /- 函数);
报文 (0-/)队列(消息队列):消息队列是消息的链接表,包
括 ! 消息队列 消息队列。有足够权限的进程可以向队列
中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列
克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小
受限等缺点。
* 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用 !"
形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机
制,如信号量结合使用,来达到进程间的同步及互斥。
1 信号量(-,23):主要作为进程间以及同一进程不同线程之间
的同步手段。
套接口($):更为一般的进程间通信机制,可用于不同机器之间
的进程间通信。起初是由 系统的 分支开发出来的,但现在一
般可以移植到其它类 系统上: 和 的变种都支持
套接字。
下面将对上述通信机制做具体阐述。
附 :参考文献45中对 环境下的进程进行了概括说明:
一般来说, 下的进程包含以下几个关键要素:
有一段可执行程序;
有专用的系统堆栈空间;
内核中有它的控制块(进程控制块),描述进程所占用的资源,这样,
进程才能接受内核的调度;
具有独立的存储空间
进程和线程有时候并不完全区分,而往往根据上下文理解其含义。
参考资料
( ) 环境高级编程,作者:672-3.8,译者:尤晋元等,
机械工业出版社。具有丰富的编程实例,以及关键函数伴随 的发
展历程。
内核源代码情景分析(上、下),毛德操、胡希明著,浙江大学
出版社,提供了对 内核非常好的分析,同时,对一些关键概念的
背景进行了详细的说明。
( ) 网络编程第二卷:进程间通信,作者:672-3.8,译
者:杨继张,清华大学出版社。一本比较全面阐述 环境下进程间
通信的书(没有信号和套接口,套接口在第一卷中)。
Linux 环境进程间通信(一)
管道及有名管道
在本系列序中作者概述了 进程间通信的几种主要手段。其中管道和有名
管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,
有名管道克服了管道没有名字的限制,因 此,除具有管道所具有的功能外,它
还允许无亲缘关系进程间的通信。 认清管道和有名管道的读写规则是在程序中
应用它们的关键,本文在详细讨论了管道和有名管道的通信机制的基础上,用
实例对其读写规则进行了程序验证,这样做 有利于增强读者对读写规则的感性
认识,同时也提供了应用范例。
、 管道概述及相关 ! 应用
管道相关的关键概念
管道是 支持的最初 !" 形式之一,具有以下特点:
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建
立起两个管道;
只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一
个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,
单独构成一种文件系统,并且只存在与内存中。
数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读
出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲
区的头部读出数据。
管道的创建:
9.:.2;
,,<.45
该函数创建的管道的两端处于一个进程中间,在实际应 用中没有太大意义,因
此,一个进程在由 ,,创建管道后,一般再 <3$ 一个子进程,然后通过管道
实现父子进程间的通信(因此也不难推出,只要两个 进程中存在亲缘关系,这
里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。
管道的读写规则:
管 道两端可分别用描述字 <.45以及 <.45来描述,需要注意的是,管道的两端
是固定了任务的。即一端只能用于读,由描述字 <.45表示,称其为管道 读端;
另一端则只能用于写,由描述字 <.45来表示,称其为管道写端。如果试图从管
道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件 的
=& 函数都可以用于管道,如 、3-.、>3 等等。
从管道中读取数据:
如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的
读出字节数为 ;
当 管道的写端存在时,如果请求的字节数目大于 ! !'?%,则返回管
道中现有的数据字节数,如果请求的字节数目不大于 ! !'?%,则返
回管道中现 有数据字节数(此时,管道中数据量小于请求的数据量);
或者返回请求的字节数(此时,管道中数据量不小于请求的数据量)。
注:(! !'?% 在 .==2 中定义,不同的内核版本
可能会有所不同。! 要求 ! !'?% 至少为 1 字节,3.2-
@ 中为 *A)。
关于管道的读规则验证:
=BBBBBBBBBBBBBB
B3-.B
BBBBBBBBBBBBBB=
9.:.2;
9.:=,2;
9.:332;
-
C
,,?<.45D
,.?,.D
2-33?E<45D
2-3>?E<4*5D
2-3B,?>E<D
3?D
.D
3?E<FFG<3?E<D
>?E<FFG<3?E<D
,?>E<H>?E<D
<,,,,?<.:
C
,3<I,,3-333JID
33KD
L
<,.H<3$HH
C
,3<IJID
,,?<.45D
,D==确保父进程关闭写端
3?H3-.,,?<.45F3?E<FD
,3< I3-.M.2.--3-.<32,,M.J
剩余63页未读,继续阅读
yangxudong
- 粉丝: 104
- 资源: 75
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页