没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux进程间通信--Linux进程间通信
Linux进程间通信--Linux进程间通信
需积分: 9 139 浏览量
更新于2023-06-01
评论
收藏 250KB DOCX 举报
Linux进程间通信--Linux进程间通信--Linux进程间通信--Linux进程间通信
资源详情
资源评论
资源推荐

深刻理解 Linux 进程间通信(IPC)
序
管道
管道概述及相关 应用
有名管道概述及相关 应用
小结
参考资料
信号(上)
信号及信号来源
信号的种类
进程对信号的响应
信号的发送
信号的安装(设置信号关联动作)
信号集及信号集操作函数
信号阻塞与信号未决
参考资料
信号(下)
信号生命周期
信号编程注意事项
深入浅出:信号应用实例
结束语
参考资料
消息队列
消息队列基本概念
操作消息队列
消息队列的限制
消息队列应用实例
小结
参考资料
信号灯
信号灯概述
信号灯
信号灯与内核
操作信号灯
信号灯的限制
竞争问题

信号灯应用实例
参考资料
共享内存(上)
. 内核怎样保证各个进程寻址到同一个共享内存区域的内存页面
及其相关系统调用
范例
对 返回地址的访问
参考资料
共享内存(下)
系统 共享内存原理
系统 共享内存
系统 共享内存限制
系统 共享内存范例
结论
参考资料
套接口
背景知识
重要数据结构
套接口编程的几个重要步骤
典型调用代码
网络编程中的其他重要概念
参考资料
本文系整理自网络 !"#$#%!#&!&'( %%) 的系列文章。
作者郑彦兴,国防科大计算机学院
0. 序
% 下的进程通信手段基本上是从 * 平台上的进程通信手段继承而来的。而对 * 发展
做出重大贡献的两大主力 +,+ 的贝尔实验室及 -./(加州大学伯克利分校的伯克利软件发布
中心)在进程间通信方面的侧重点有所不同。前者对 * 早期的进程间通信手段进行了系统
的改进和扩充,形成了“(0(#12,通信进程局限在单个计算机内;后者则跳过了该限制,
形成了基于套接口((! '#)的进程间通信机制。 则把两者继承了下来,如图示:

其中,最初 *1 包括:管道、334、信号;.0(#1 包括:.0(# 消息队列、
.0(# 信号灯、.0(# 共享内存区;!(1 包括: !( 消息队列、!( 信号灯、
!( 共享内存区。有两点需要简单说明一下:)由于 * 版本的多样性,电子电气工程协
会(555)开发了一个独立的 * 标准,这个新的 6.* 标准被称为计算机环境的可移
植性操作系统界面(.47)。现有大部分 * 和流行版本都是遵循 4.7 标准的,而
从一开始就遵循 4.7 标准;)-./ 并不是没有涉足单机内的进程间通信((! '#
本身就可以用于单机内的进程间通信)。事实上,很多 * 版本的单机 1 留有 -./ 的痕迹,
如 -./ 支持的匿名内存映射、8-./ 对可靠信号语义的实现等等。
图一给出了 %所支持的各种 1 手段,在本文接下来的讨论中,为了避免概念上的混淆,
在尽可能少提及 * 的各个版本的情况下,所有问题的讨论最终都会归结到 环境下的
进程间通信上来。并且,对于 所支持通信手段的不同实现版本(如对于共享内存来说,
有 !( 共享内存区以及 .0(# 共享内存区两个实现版本),将主要介绍 !(。
% 下进程间通信的几种主要手段简介:
管道(#)及有名管道(#"#):管道可用于具有亲缘关系进程间的通信,有
名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘
关系进程间的通信;
信号(.9%):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了
用于进程间通信外,进程还可以发送信号给进程本身;% 除了支持 * 早期信号语
义函数 (9% 外,还支持语义符合 !( 标准的信号函数 (9 !(实际上,该函数
是基于 -./ 的,-./ 为了实现可靠信号机制,又能够统一对外接口,用 (9 ! 函数
重新实现了 (9% 函数);
报文(:#((9#)队列(消息队列):消息队列是消息的链接表,包括 !( 消息队列
(0(# 消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则
可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流
以及缓冲区大小受限等缺点。
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用 1 形式。是针对其他
通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程
间的同步及互斥。
信号量((#!&#):主要作为进程间以及同一进程不同线程之间的同步手段。

套接口(.! '#):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。
起初是由 * 系统的 -./ 分支开发出来的,但现在一般可以移植到其它类 * 系统上:
和 .0(# 的变种都支持套接字。
下面将对上述通信机制做具体阐述。
附 :参考文献;<中对 % 环境下的进程进行了概括说明:
一般来说,% 下的进程包含以下几个关键要素:
有一段可执行程序;
有专用的系统堆栈空间;
内核中有它的控制块(进程控制块),描述进程所占用的资源,这样,进程才能接受内
核的调度;
具有独立的存储空间
进程和线程有时候并不完全区分,而往往根据上下文理解其含义。
参考资料
*67 环境高级编程,作者:=> &".#$#(,译者:尤晋元等,机械工业出版社。
具有丰富的编程实例,以及关键函数伴随 * 的发展历程。
% 内核源代码情景分析(上、下),毛德操、胡希明著,浙江大学出版社,提供了
对 % 内核非常好的分析,同时,对一些关键概念的背景进行了详细的说明。
*67 网络编程第二卷:进程间通信,作者:=> &".#$#(,译者:杨继张,清
华大学出版社。一本比较全面阐述 * 环境下进程间通信的书(没有信号和套接口,
套接口在第一卷中)。
1. 管道
在本系列序中作者概述了 %进程间通信的几种主要手段。其中管道和有名管道是最早的进
程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的
限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。认清管道和有
名管道的读写规则是在程序中应用它们的关键,本文在详细讨论了管道和有名管道的通信机制
的基础上,用实例对其读写规则进行了程序验证,这样做有利于增强读者对读写规则的感性认
识,同时也提供了应用范例。
1.1. 管道概述及相关 API 应用
1.1.1 管道相关的关键概念
管道是 支持的最初 *1 形式之一,具有以下特点:
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);

单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不
是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且
只存在与内存中。
数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容
每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
1.1.2 管道的创建
? %"#@("A
#B";<
该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在
由 #创建管道后,一般再 B!&' 一个子进程,然后通过管道实现父子进程间的通信(因此也
不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采
用管道方式来进行通信)。
1.1.3 管道的读写规则
管道两端可分别用描述字 B";<以及 B";<来描述,需要注意的是,管道的两端是固定了任务的。
即一端只能用于读,由描述字 B";<表示,称其为管道读端;另一端则只能用于写,由描述字
B";<来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将
导致错误发生。一般文件的 4 函数都可以用于管道,如 %!(#、&#"、&# 等等。
从管道中读取数据:
如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为
;
当管道的写端存在时,如果请求的字节数目大于 5C-*3,则返回管道中现有的数据
字节数,如果请求的字节数目不大于 5C-*3,则返回管道中现有数据字节数(此时,
管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小
于请求的数据量)。注:(5C-*3 在 %"#%%( 中定义,不同的内核
版本可能会有所不同。!( 要求 5C-*3 至少为 字节,&#" 中为
D)。
关于管道的读规则验证:
EEEEEEEEEEEEEE
E&#"#( E
EEEEEEEEEEEEEE
? %"#@("A
? %"#@(0(0#(A
? %"#@#&&!A
剩余63页未读,继续阅读


















草原苍狼
- 粉丝: 72
- 资源: 19
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- ARM Cortex-A(armV7)编程手册V4.0.pdf
- ABB机器人保养总结解析.ppt
- 【超详细图解】菜鸡如何理解双向链表的python代码实现
- 常用网络命令的使用 ipconfig ping ARP FTP Netstat Route Tftp Tracert Telnet nslookup
- 基于单片机控制的DC-DC变换电路
- RS-232接口电路的ESD保护.pdf
- linux下用time(NULL)函数和localtime()获取当前时间的方法
- Openstack用户使用手册.docx
- KUKA KR 30 hA,KR 60 hA机器人产品手册.pdf
- Java programming with JNI
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0