文章目录
- 1.进程内存空间布局
- 2.Linux进程间通信机制
- (1)管道
- (2)命名管道
- (3)XSI IPC机制
- (4)IPC对象的key值和ID
- (5)XSI IPC机制的使用规律
1.进程内存空间布局
- 进程和进程之间存在独立的内核资源以及用户空间资源
2.Linux进程间通信机制
(1)管道
- 管道是最古老、最简单的UNIX进程间通信机制
- 管道是一种特殊文件
- 管道的局限性
半双工:一个进程写,一个进程读
只能在父子进程之间使用 - filedes:file descripe
(2)命名管道
- 管道只能在父子进程之间使用
- FIFO 也被称为命名管道, FIFO 是一种特殊的文件
(创建FIFO 类似于创建文件,FIFO 的路径名存在于文件系统中) - 创建FIFO 之后可以通过文件I/O 对其进行操作
- 非父子进程可以通过文件名来使用FIFO
(3)XSI IPC机制
- 信号量集(semaphore set ):用于实现进程之间的同步与互斥
- 共享内存(shared memory ):用于在进程之间高效地共享数据,适用于数据量大,速度要求高的场景
- 消息队列(message queue ):进程之间传递数据的一种简单方法
- 列出IPC对象:三种
信号量集和消息队列往往是出现在某个瞬时
(4)IPC对象的key值和ID
- Linux 系统中的IPC 对象都是全局的,为每个IPC 对象分配唯一的ID
- 在IPC 操作中通信各方需要通过ID 来指示操作的IPC对象,需要有机地让通信各方(各个进程)获取IPC对象的ID,即:真正创建IPC对象的进程只有一个,其它的进程都是使用该IPC对象
- 创建IPC 对象的进程通过创建IPC 对象函数的返回值可获取ID值,但是未创建IPC 对象的进程如何获取IPC 对象的ID 值并使用该对象呢?
IPC 机制的 ID 值为动态分配,无法提前约定,不能跨进程传递! - 多个进程提前约定使用相同的key值做为参数,来创建IPC 对象或打开已经创建的IPC 对象
如果通信各方(进程)在创建/ 打开IPC 对象时使用相同的key 值:
⚫首次使用该key值创建IPC对象的进程将真正创建该IPC对象,并获取其ID值
⚫后续使用该key值创建IPC对象的进程都将在内核中找到该IPC对象并打开它,从而获取其ID值(这是因为:进程之间的执行顺序,互相是不知道的) - IPC 对象与key 值一一对应,因此key 通过ftok 函数来产生独特的key 值,避免重复
(5)XSI IPC机制的使用规律