程序間通訊IPC

2021-10-25 21:34:39 字數 2153 閱讀 9138

程序間通訊是多程序協作的基礎,利用多程序協作,我們可以將功能模組化,增強模組間的隔離,以及提高容錯能力。

程序間通訊的乙個重要功能就是在程序間傳遞資料,「訊息」就是ipc中常用的資料傳遞方式。

訊息的傳遞一般需要乙個中間人,一般可分為兩種形式:

經典的記憶體通訊方式由管道、訊息佇列、訊號量,共享記憶體、訊號機制,以及套接字。接下來主要介紹由作業系統輔助的通訊。

管道是兩個程序間的一條通道,一端負責投遞,一端負責接收。所以如果要實現雙向通訊,需要兩個管道。

管道的通訊訊息是位元組流,所以需要應用自己去解析訊息資料,

具體實現上,unix系統會把管道當作乙個檔案,核心為使用者態提供管道的檔案描述符。不過實際上,管道不會使用儲存裝置,而是使用記憶體作為乙個資料的緩衝區

命名管道和匿名管道的區別在於建立方式。匿名管道通過pipe系統呼叫建立。在建立時程序只會拿到兩個檔案描述符,所以通常情況下,只是結合fork使用,也就是父程序與子程序間的通訊

命名管道通過mkfifo命令建立。在建立時會指定乙個全域性檔名。這樣就適合任意程序間的通訊

訊息佇列支援多個傳送者和接收者,傳送和接收的介面是核心提供的。當建立訊息佇列時,核心將從系統記憶體中分配乙個佇列資料結構,作為訊息佇列的核心物件。訊息佇列以鍊錶的形式管理,每個節點中,包含了資料以及型別標誌,型別的具體意義需要使用者態程式自己管理。

訊息佇列一般被抽象為4個操作:msgget(獲取已有訊息佇列的連線,或者建立),msgsnd(傳送訊息),msgrcv(接收訊息),msgctl(管理訊息佇列)。可以設定傳送和接收訊息是否為阻塞的。

訊息佇列存放在核心中,只有在核心重啟(即,作業系統重啟)或者顯示地刪除乙個訊息佇列時,該訊息佇列才會被真正的刪除。

訊號量在實際中主要作用是程序間的同步。管道,訊息佇列等可以傳遞資料但是不提供強制同步機制。

訊號量一般來說只有乙個共享的整型計數器,由核心維護,對訊號量的操作需要經過核心的系統呼叫。

對訊號量的主要操作是p,v原語。這兩個操作是原子的

通過訊號量,可以實現程序間的互斥以及同步

如果要實現互斥,可設訊號量mutex,初始值為1,在進入臨界區之前執行p(mutex),在臨界區之後執行v(mutex),pv操作必須成對出現。這類似於加鎖,而鎖只有一把,實現了互斥性。

如果要實現同步,可設訊號量semaphore s= 0 。假設要求a步驟在前,b步驟在後,則可在a操作執行v(s), 在b操作執行p(s)。p,v操作由不同的程序分別執行,這樣可保證a,b操作的順序性。至於原因,可以通過上述p,v操作具體實現進行推導易得。

訊號提供了單向的事件通知能力。訊號量也有通知能力,但是需要程序主動去查詢計數器狀態或者陷入阻塞。使用訊號,乙個程序可以隨時傳送乙個事件到特定的程序、執行緒或者程序組,並且接收訊號的程序不需要阻塞,核心會幫助切換到其對應的訊號處理函式,並在處理完之後恢復之前的上下文。

linux核心會為每個程序和執行緒準備乙個訊號事件等待佇列。乙個程序內的執行緒共享程序的等待佇列,並且有自己私有的佇列。

linux還提供了系統呼叫sigprocmask,允許使用者程式設定對特定訊號的阻塞狀態。當乙個訊號被阻塞,linux將不會觸發這個訊號對應的處理函式,直到該訊號被解除阻塞、(但是有很多訊號是不能被阻塞的,例如使用者使用crtl+c 殺死乙個程序)。

訊號被處理的時機通常是記憶體執行完異常、中斷、系統呼叫等返回使用者態的時刻。這時,核心會檢查乙個狀態來判斷是否有訊號需要處理。

特別注意,訊號處理函式需要是可重入的,使用者自己實現時需要注意。

套接字是又可以用於本地,又可以用於網路的通訊機制。在本地通訊時,一般利用本地回環ip(127.0.0.1),不同的程序繫結不同的

套接字可以利用不同的協議,例如:

程序間通訊IPC

這兩天學習了 unix 的程序間通訊 ipc,這裡面有幾個很重要的基本概念,特別是訊息佇列和我的畢設很有關係,因此多說幾句。以前學習的程序間通訊方式,一般都是經由 fork 或exec 開啟檔案,或經過檔案系統。而 ipc是程序間通訊方式的統稱。下面一一道來。一 管道 管道是最老的 ipc形式。管道...

程序間通訊 IPC

part2 index1.html part2 index2.html linux至少支援如下ipc機制 同時支援posix和system v方式 streams ipc機制,linux本身不支援,有乙個單獨的安裝包 可以跨pc的程序通訊 互斥鎖或條件變數 動態初始化 不能使靜態分配 在共享記憶體中...

程序間通訊IPC

乙個大型的應用系統,往往需要眾多程序協作,程序間通訊的重要性顯而易見。首先,程序間通訊至少可以通過傳送開啟檔案來實現,不同的程序通過乙個或多個檔案來傳遞資訊,事實上,在很多應用系統裡,都使用了這種方法。但一般說來,程序間通訊 ipc interprocess communication 不包括這種似...