进程间的通信方式
进程通信(Interprocess Communication,IPC)是一个进程与另一个进程间共享消息的一种通信方式。消息(message)是发送进程形成的一个消息块,将消息内容传送给接收进程。
进程间通信的目的
数据传输
一个进程需要将其数据发送给另一进程,发送的数据量在一个字节到几M字节之间。共享数据
多个进程操作共享数据事件通知
一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。资源共享
多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。进程控制
有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
8种通信方式
匿名管道
是一种半双工的通信方式(即数据只能单向流动),且只能在具有亲缘关系的进程间使用(亲缘关系指的父子进程或者兄弟子进程),该管道只存在于内存之中。
流管道
是一种全双工的通信方式(即数据能双向流动)
注:对该方法不熟悉,请自行搜索更多相关内容
命名管道
与匿名管道一样是一种半双工的通信方式(即数据只能单向流动),但克服了匿名管道只能在具有亲缘关系的进程间使用的限制,允许无亲缘关系的进程间使用,管道以一种特殊设备文件形式存在于文件系统中。
信号
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
消息队列
是消息的链表,存放在内核中,一个消息队列由一个标识符(即队列ID)来标识。
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
共享内存
两个或多个进程共享一个给定的存储区,是最快的一种 IPC,因为进程是直接对内存进行存取。
因为多个进程可以同时操作,所以需要进行同步。
信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。
信号量
信号量是一个计数器,用于实现进程间的互斥与同步,若要在进程间传递数据需要结合共享内存。
信号量是基于操作系统的PV操作,程序对信号量的操作都是原子操作。
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
支持信号量组。
套接字,即socket通信,与其他通信机制不同的是,它可用于不同机器间的进程通信。
进程间的通信和线程间的通信的区别
只有进程间需要通信,线程间由于共享进程的地址空间,因此没有通信必要,但要做好同步和互斥,保护共享的变量。