常见的通信方式
-
共享文件:两个进程之间可用通过共享文件的方式进行通信,即一个进程在文件中写入消息,另一个进程从文件中读取消息,有无血缘都可以,但是通过共享同一个文件进行进程间通信的缺点是,两个进程的读写同步问题,即一个进程写的慢另外一个进程读的快的时候会读不到内容。
-
匿名管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,pipe实现是以环形队列形式实现的,所以数据只能读一次。进程的亲缘关系通常是指父子进程关系。
-
有名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
-
消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
-
共享存储SharedMemory:共享内存用于进程间通信的时候由于是直接操作内存所以效率高,但是没有阻塞属性,所以就要考虑两个进程写入和读出的先后性问题了。mmap可以通过将一个已存在的一个文件映射到内存让两个进程读写来进行进程间通信。当然mmap也可以可以直接在内存映射一个匿名映射区进行进程间通信。但是mmap用于无血缘关系的进程间通信时,必须借助一个已存在的文件的内存映射区进行。
-
信号量Semaphore:共享内存用于进程间的通信可能存在多个进程竞争内存您的问题,为避免这个问题而我们可以使用信号量进行进程间通信。信号量是一种用于实现计算机资源共享的IPC机制之一,其本质是一个计数器。信号量是在多进程环境下实现资源互斥访问或共享资源访问的方法,可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,进程/线程必须获取一个信号量;一旦该关键代码段完成了,那么该进程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个进程释放信号量。
信号量有两种应用形式:一种用于临界资源的互斥访问,临界资源在同一时刻只允许一个进程使用,此时的信号量是一个二元信号量,它只控制一个资源;另一种应用于处理多个共享资源(例如多台打印机的分配),信号量在其中起到记录空闲资源数目的作用。
-
信号Signal : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
-
套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
参考