進程間的通訊方式

因爲內存管理的一些機制,進程的用戶空間是相互獨立的,通常是不能相互訪問的,惟一例外的是共享內存。所以咱們須要利用一些介質來完成進程間的通訊。
linux

進程間通訊方式:
編程

(1)管道socket

linux中的管道分爲無名管道和有名管道,前者用於父進程和子進程間的通訊,後者用於任意兩個進程間的通訊。無名管道由pipe(int filedis[2])函數建立。參數filedis返回兩個文件描述符。filedes[0]爲讀而打開,filedes[1]爲寫而打開。filedes[1]的輸出是filedes[0]的輸入ide

在linux中,有名管道可由兩種方式建立:命令行方式mknod系統調用和函數mkfifo,生成一個myfifo的有名管道。 生成了有名管道後,就可使用通常的文件I/O函數如open、close、read、write等來對它進行操做。函數

(2)消息隊列(使用不多)測試

消息隊列用於運行於同一臺機器上的進程間通訊,它和管道很類似,是一個在系統內核中用來保存消息的隊列,它在系統內核中是以消息鏈表的形式出現。消息鏈表中節點的結構用msg聲明。
事實上,它是一種正逐漸被淘汰的通訊方式,咱們能夠用流管道或者套接口的方式來取代它,因此,咱們對此方式也再也不解釋,也建議讀者忽略這種方式。spa

(3)共享內存(使用最多)操作系統

共享內存時同一主機上兩個進程間通訊的最快方式,由於數據不須要在不一樣進程間複製,一般一個進程建立一塊共享內存區,其他進程對這塊內存區進行讀寫。獲得共享內存區有兩種方式:映射/dev/mem設備內存映像文件前一種方式不給系統帶來額外的開銷,但在現實中並不經常使用,由於它控制存取的將是實際的物理內存。後一種方式是經常使用的:經過shmXXX函數族來實現利用共享內存進行存儲的。 命令行

 首先要用的函數是shmget(),它得到一個共享存儲標識符 --> 當共享內存建立後,其他進程能夠調用shmat()將其鏈接到自身的地址空間中。orm

 使用共享存儲來實現進程間通訊的注意點是對數據存取的同步,必須確保當一個進程去讀取數據時,它所想要的數據已經寫好了。能夠經過使用shmctl函數設置共享存儲內存的某些標誌位如SHM_LOCK、SHM_UNLOCK等來實現。但更多時候咱們利用下面要講的信號量來實現對共享存儲數據存取的同步。

(4)信號

 信號量是一個計數器,它用來記錄對某個資源(如共享內存)的存取情況。通常說來,爲了得到共享資源,進程須要執行下列操做:

(a)測試控制該資源的信號量

(b)當信號量爲正,則容許進行使用該資源,進程將信號量減1

(c)當信號量爲0,則該資源目前不可用,進程進入睡眠狀態,直至信號量大於0,進程被喚醒,轉爲步驟(a)

(d)當進程再也不使用一個信號量控制的資源時,信號量值加1。若是此時有進程正在睡眠等待此信號量,則喚醒此進程。

(3)套接字

套接口(socket)編程是實現Linux系統和其餘大多數操做系統中進程間通訊的主要方式之一。咱們熟知的WWW服務、FTP服務、TELNET服務 等都是基於套接口編程來實現的。除了在異地的計算機進程間之外,套接口一樣適用於本地同一臺計算機內部的進程間通訊。

相關文章
相關標籤/搜索