进程间通信常见方式如下:
管道
FIFO
消息队列
信号量
共享内存
UNXI域套接字
套接字(Socket)
管道
管道是一种古老的IPC通信形式。
它的特点:
1.它是半双工的,具有固定的读端和写端;
2.它只能用于父子进程或者兄弟进程之间的进程的通信;
3.它可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
命名管道
FIFO 可以在无关的进程之间交换数据,与无名管道不同;
FIFO 有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
消息队列
基本原理:A 进程要给 B 进程发送消息,A 进程把数据放在对应的消息队列后就可以正常返回了,B 进程需要的时候再去读取数据就可以了。
特点:
- 消息队列是保存在内核中的消息链表,每个消息体都是固定⼤⼩的存储块。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。
- 如果没有释放消息队列或者没有关闭操作系统,消息队列会⼀直存在。
信号量
3. 信号量(semaphore)是一个计数器。用于实现进程间的互斥与同步,而不是用于存储进程间通信数据;
4. 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存;
5. 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作;
6. 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数;
7. 支持信号量组。
共享内存
- 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区;
- 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
Socket
socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
参考文章:https://www.cnblogs.com/qtiger/p/5856660.html