一,定义
进程间通信(IPC,Inter-Process Communication)是指在不同进程间传播和交换信息。
二,进程间通信的几种方式
常见的进程间的通信方式为7种:
- 1,管道(pipe)。又称无名管道,是最古老的进程间通信的方式。
- 2,命名管道(FIFO)。
- 3,消息队列(MessageQueue)。
- 4,信号量(Semaphore)。
- 5,共享内存(SharedMemory)。
- 6,套接字Socket。
- 7,信号(signal)。
按照通信类型划分:
1,共享存储系统
- 基于共享数据结构的通信方式。(仅适用于传递相对少量的数据,通信效率低,数据低级通信)。
- 基于共享存储区的通信方式。
2,管道通信系统。
3,消息传递系统。
4,客户机服务器系统。
三,进程间通信几种方式详解
1,管道(pipe)
把一个进程连接到另外一个进程的一个数据流成为管道,通常一个进程的输出作为另外一个进程的输入。本质是内核的一块缓存。Linux的管道主要有两种:无名管道和有名管道。
- 1,无名管道
无名管道是管道通信的一种原始的方法。主要特点是:
(1),他只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。
(2),它是半双工的通信模式,具有固定的读端和写端。
(3)管道可以看成是一个特殊的文件,可以使用普通的read、write函数。但是它不是普通的文件,存在于内存中并不属于其他的文件系统。
详细的介绍及其实践 - 2,命名管道(FIFO)
有名管道是对无名管道的一个改进。其具有的特点是:
(1),互不相关的程序之间也能实现彼此通信。
(2),管道可以通过路径指出,在文件系统中是可见的。在建立管道后,进程之间把它当成普通的文件进行读(read)写(write)操作,和使用文件一样方便。
(3),严格遵循FIFO(先进先出)规则。对管道的数据的读总是从开始处返回数据,结尾处添加数据,不知道文件定位符的操作,如lseek()。
详细的介绍及其实践
2,消息队列(MessageQueue)
消息队列提供一个进程向另外一个进程发送数据块的一种方法。消息队列区别与像rabbitmq这样的消息队列的中间模块。
另外一中解释是消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。
基本特性:
- 在某个进程往一个队列写入消息之前,并不需要另外一个进程在该队列上等待消息的到达。
- 消息队列具有内核的持续性。一个进程可以往某个队列写入一些消息,然后终止,让另外一个进程在以后某个时刻读出这些消息。
- 队列属性。
- 消息队列可用双向通信。
插入知识点:
1,进程持续性:随进程持续的IPC:一直存在到打开IPC对象的最后一个进程关闭该对象为止。
2,内核持续性:随着内核持续的IPC:一直存在到内核重新自举或显式删除IPC为止。
3,文件系统持续性:随文件系统的持续的IPC:一直存在到显式删除IPC为止。
IPC类型 | 持续性 |
---|---|
FIFO | 随进程 |
Posix互斥锁 | 随进程 |
Posix条件变量 | 随进程 |
Posix读写锁 | 随进程 |
fcntl记录上锁 | 随进程 |
Posix消息队列 | 随内核 |
Posix有名信号量 | 随内核 |
Posix基于内存的信号量 | 随进程 |
Posix共享内存区 | 随内核 |
System V消息队列 | 随内核 |
System V信号量 | 随内核 |
System V共享存储区 | 随内核 |
TCP套接字 | 随进程 |
UDP套接字 | 随进程 |
Unix域套接字 | 随进程 |
3,信号量(Semaphore)
定义:信号量(Semaphore)用于实现进程之间的互斥与同步,而不是用于进程之间的数据通信。主要实现是基于操作系统的PV操作。
特点:
1,信号量用于进程间同步,若要在进程之间传递需要结合共享内存。
2,信号量是基于操作系统的PV操作,程序对信号量的操作都是原子操作。
3,每次对信号量的PV操作不仅限于对信号量的值加1或减1,而且可以加减任意正整数。
4,支持信号量组。
信号量函数介绍及其实践例子
4,共享内存(SharedMemory)
定义:共享内存允许两个或更多的进程访问同一块内存,就如同malloc()函数向不同进程返回了一个指向同一个物理内存的指针。
5,套接字Socket
定义:套接字(socket)用于协调不同的进程间的通信,可以是不同计算机上的进程。
套接字通信方式很多,有Unix域套接字、TCP套接字、UDP套接字、链路层套接字等等。最常用的是TCP套接字。下面链接中一个详细的介绍
套接字的介绍
6,信号(signal)
概念:
1)信号是在软件层上对中断机制的一种模拟,是一种异步通信方式。
2)信号可以直接进行用户控件进程和内核进程之间的交互,内核进程也可以利用它通知用户空间进程发生了哪些系统事件。
3)如果该进程当前并未处于执行态,则该信号就由内核保护起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。