Linux程式間通訊的6種不同方式

pythontab發表於2018-01-11

程式的概念

程式是作業系統的概念,每當我們執行一個程式時,對於作業系統來講就建立了一個程式,在這個過程中,伴隨著資源的分配和釋放。可以認為程式是一個程式的一次執行過程。

程式通訊的概念

程式使用者空間是相互獨立的,一般而言是不能相互訪問的。但很多情況下程式間需要互相通訊,來完成系統的某項功能。程式透過與核心及其它程式之間的互相通訊來協調它們的行為。

程式通訊的應用場景

資料傳輸:一個程式需要將它的資料傳送給另一個程式,傳送的資料量在一個位元組到幾兆位元組之間。

共享資料:多個程式想要操作共享資料,一個程式對共享資料的修改,別的程式應該立刻看到。

通知事件:一個程式需要向另一個或一組程式傳送訊息,通知它(它們)發生了某種事件(如程式終止時要通知父程式)。

資源共享:多個程式之間共享同樣的資源。為了作到這一點,需要核心提供鎖和同步機制。

程式控制:有些程式希望完全控制另一個程式的執行(如Debug程式),此時控制程式希望能夠攔截另一個程式的所有陷入和異常,並能夠及時知道它的狀態改變。

程式通訊的方式

1.管道

管道分為有名管道和無名管道

無名管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程式間使用.程式的親緣關係一般指的是父子關係。無明管道一般用於兩個不同程式之間的通訊。當一個程式建立了一個管道,並呼叫fork建立自己的一個子程式後,父程式關閉讀管道端,子程式關閉寫管道端,這樣提供了兩個程式之間資料流動的一種方式。

有名管道也是一種半雙工的通訊方式,但是它允許無親緣關係程式間的通訊。

2.訊號量

訊號量是一個計數器,可以用來控制多個執行緒對共享資源的訪問.,它不是用於交換大批資料,而用於多執行緒之間的同步.它常作為一種鎖機制,防止某程式在訪問資源時其它程式也訪問該資源.因此,主要作為程式間以及同一個程式內不同執行緒之間的同步手段.

Linux提供了一組精心設計的訊號量介面來對訊號進行操作,它們不只是針對二進位制訊號量,下面將會對這些函式進行介紹,但請注意,這些函式都是用來對成組的訊號量值進行操作的。它們宣告在標頭檔案sys/sem.h中。

semget函式

它的作用是建立一個新訊號量或取得一個已有訊號量

semop函式

它的作用是改變訊號量的值

semctl函式

該函式用來直接控制訊號量資訊

3.訊號

訊號是一種比較複雜的通訊方式,用於通知接收程式某個事件已經發生.

4.訊息佇列

訊息佇列是訊息的連結串列,存放在核心中並由訊息佇列識別符號標識.訊息佇列克服了訊號傳遞資訊少,管道只能承載無格式位元組流以及緩衝區大小受限等特點.訊息佇列是UNIX下不同程式之間可實現共享資源的一種機制,UNIX允許不同程式將格式化的資料流以訊息佇列形式傳送給任意程式.對訊息佇列具有操作許可權的程式都可以使用msget完成對訊息佇列的操作控制.透過使用訊息型別,程式可以按任何順序讀資訊,或為訊息安排優先順序順序.

5.共享記憶體

共享記憶體就是對映一段能被其他程式所訪問的記憶體,這段共享記憶體由一個程式建立,但多個程式都可以訪問.共享記憶體是最快的IPC(程式間通訊)方式,它是針對其它程式間通訊方式執行效率低而專門設計的.它往往與其他通訊機制,如訊號量,配合使用,來實現程式間的同步與通訊.

6.套接字

socket,即套接字是一種通訊機制,憑藉這種機制,客戶/伺服器(即要進行通訊的程式)系統的開發工作既可以在本地單機上進行,也可以跨網路進行。也就是說它可以讓不在同一臺計算機但透過網路連線計算機上的程式進行通訊。也因為這樣,套接字明確地將客戶端和伺服器區分開來。

套接字的特性由3個屬性確定,它們分別是:域、型別和協議。

可用於不同及其間的程式通訊


相關文章