進(jìn)程間通信(IPC蜂林,InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。IPC的方式通常有管道(包括無名管道和命名管道)、消息隊列匣摘、信號量亏吝、信號岭埠、共享內(nèi)存、Socket等蔚鸥。其中 Socket支持不同主機(jī)上的兩個進(jìn)程IPC惜论。
一、管道 (無名管道/有名管道)
無名管道( pipe )特點(diǎn):
a) 它是半雙工的(即數(shù)據(jù)只能在一個方向上流動)止喷,具有固定的讀端和寫端馆类。
b)它只能用于具有親緣關(guān)系的進(jìn)程之間的通信(也是父子進(jìn)程或者兄弟進(jìn)程之間)。
c)它可以看成是一種特殊的文件弹谁,對于它的讀寫也可以使用普通的read乾巧、write 等函數(shù)。但是它不是普通的文件预愤,并不屬于其他任何文件系統(tǒng)沟于,并且只存在于內(nèi)存中。
有名管道也是一種半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信植康。
二旷太、消息隊列
消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內(nèi)核中并由消息隊列標(biāo)識符標(biāo)識销睁。消息隊列克服了信號傳遞信息少供璧、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
特點(diǎn):
a) 消息隊列是面向記錄的冻记,其中的消息具有特定的格式以及特定的優(yōu)先級嗜傅。
b) 消息隊列獨(dú)立于發(fā)送與接收進(jìn)程。進(jìn)程終止時檩赢,消息隊列及其內(nèi)容并不會被刪除吕嘀。
c) 消息隊列可以實(shí)現(xiàn)消息的隨機(jī)查詢,消息不一定要以先進(jìn)先出的次序讀取,也可以按消息的類型讀取。
三贞瞒、信號量
信號量( semophore ) : 信號量是一個計數(shù)器偶房,可以用來控制多個進(jìn)程對共享資源的訪問。它常作為一種鎖機(jī)制军浆,防止某進(jìn)程正在訪問共享資源時棕洋,其他進(jìn)程也訪問該資源。因此乒融,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段掰盘。
特點(diǎn):
a) 信號量用于進(jìn)程間同步摄悯,若要在進(jìn)程間傳遞數(shù)據(jù)需要結(jié)合共享內(nèi)存。
b) 信號量基于操作系統(tǒng)的 PV 操作愧捕,程序?qū)π盘柫康牟僮鞫际窃硬僮鳌?/p>
c) 每次對信號量的 PV 操作不僅限于對信號量值加 1 或減 1奢驯,而且可以加減任意正整數(shù)。
d) 支持信號量組次绘。
四瘪阁、信號
信號 ( singal ) : 信號是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個事件已經(jīng)發(fā)生邮偎。
五管跺、共享內(nèi)存
共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建禾进,但多個進(jìn)程都可以訪問豁跑。共享內(nèi)存是最快的 IPC 方式,它是針對其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計的泻云。它往往與其他通信機(jī)制贩绕,如信號兩,配合使用壶愤,來實(shí)現(xiàn)進(jìn)程間的同步和通信。
特點(diǎn):
a) 共享內(nèi)存是最快的一種IPC馏鹤,因?yàn)檫M(jìn)程是直接對內(nèi)存進(jìn)行存取征椒。
b) 因?yàn)槎鄠€進(jìn)程可以同時操作,所以需要進(jìn)行同步湃累。
c) 信號量+共享內(nèi)存通常結(jié)合在一起使用勃救,信號量用來同步對共享內(nèi)存的訪問。
六治力、套接字
套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制蒙秒,與其他通信機(jī)制不同的是,它可用于不同機(jī)器間的進(jìn)程通信宵统。