文档介绍:深刻理解Linux进程间通信(IPC)
0. 序
1. 管道
. 管道概述及相关API应用
. 有名管道概述及相关API应用
. 小结
. 参考资料
2. 信号(上)
. 信号及信号来源
. 信号的种类
. 进程对信号的响应
. 信号的发送
. 信号的安装(设置信号关联动作)
. 信号集及信号集操作函数
. 信号阻塞与信号未决
. 参考资料
3. 信号(下)
. 信号生命周期
. 信号编程注意事项
. 深入浅出:信号应用实例
. 结束语
. 参考资料
4. 消息队列
. 消息队列基本概念
. 操作消息队列
. 消息队列的限制
. 消息队列应用实例
. 小结
. 参考资料
5. 信号灯
. 信号灯概述
. Linux信号灯
. 信号灯与内核
. 操作信号灯
. 信号灯的限制
. 竞争问题
. 信号灯应用实例
. 参考资料
6. 共享内存(上)
. 内核怎样保证各个进程寻址到同一个共享内存区域的内存页面
. mmap()及其相关系统调用
. mmap()范例
. 对mmap()返回地址的访问
. 参考资料
7. 共享内存(下)
. 系统V共享内存原理
. 系统V共享内存API
. 系统V共享内存限制
. 系统V共享内存范例
. 结论
. 参考资料
8. 套接口
. 背景知识
. 重要数据结构
. 套接口编程的几个重要步骤
. 典型调用代码
. 网络编程中的其他重要概念
. 参考资料
/linux/l-ipc/的系列文章。
作者郑彦兴,国防科大计算机学院
0. 序
linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来,如图示:
其中,最初Unix IPC包括:管道、FIFO、信号;System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;Posix IPC包括: Posix消息队列、Posix信号灯、Posix共享内存区。有两点需要简单说明一下:1)由于Unix版本的多样性,电子电气工程协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算机环境的可移植性操作系统界面(PSOIX)。现有大部分Unix和流行版本都是遵循POSIX标准的,而Linux从一开始就遵循POSIX标准;2)BSD并不是没有涉足单机内的进程间通信(socket本身就可以用于单机内的进程间通信)。事实上,很多Unix版本的单机IPC留有BSD的痕迹,、+BSD对可靠信号语义的实现等等。
图一给出了linux 所支持的各种IPC手段,在本文接下来的讨论中,为了避免概念上的混淆,在尽可能少提及Unix的各个版本的情况下,所有问题的讨论最终都会归结到Linux环境下的进程间通信上来。并且,对于Linux所支持通信手段的不同实现版本(如对于共享内存来说,有Posix共享内存区以及System V共享内存区两个实现版本),将主要介绍Posix API。
linux下进程间通信的几种主要手段简介:
管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V