一:需要进程通信的场景
数据传输:一个进程将数据发送到另一个进程
共享数据:多个进程操作共享数据,一个进程修改,其他进程可以立刻看到
通知事件:一个进程向另一个(组)进程发送数据,通知有事件发生
进程控制:有些进程希望控制另一个进程的过程。
二:通信方式
1:管道
2:信号
3:消息队列
4:共享内存
5:存储映射IO
6:信号量
7:套接字
三:具体详解
1:管道(是一种单向通信的机制,半双工)
无名管道:用于存在父子关系,兄弟关系的进程中;单向传输,若双向通信,需要两条管道;特殊的文件,存在内存中。
有名管道:可以用于任意的进程中通信;单向传输,若双向通信,需要两条管道;是FIFO文件,存在文件系统中。
管道特点:
单向通信;支持无格式字节流;有缓存大小限制
2:信号:
是对中断机制软件上的模拟,信号是异步的,不必通过任何操作来等待信号过来。
3:消息队列:
同一台机器上的进程间通信,它和管道很相似,系统内核是--消息链表,克服了信号传递信息小,管道只能传输无格式数据与受缓存大小限制。
过程:创建或打开消息队列,添加消息,读取消息和控制消息队列。
4;共享内存
提供服务器进程与客户端进程通信,不需要数据复制,速度最快。一个进程写共享内存时候,另一个不可以读,通过信号量实现共享内存访问。
5:存储映射IO
存储映射函数mmap,通过映射一个普通的文件实现共享内存(将文件映射到虚拟内存上,通过访问修改内存,实现访问修改文件)
共享内存与存储映射IO比较:
a:mmap在磁盘上建立一个文件,每个线程的地址空间开辟一块空间进行映射,而共享内存是共享一块物理内存区域,所mmap映射文件保存在硬盘上,不会丢失,二共享内存会丢失。
6:信号量
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
7:套接字
可以用于不同机器的进程间通信。