Linux 程序間通訊

2021-09-25 17:26:09 字數 1802 閱讀 1531

程序間通訊的目的:

資料傳輸:乙個程序需要將它的資料傳送給另乙個程序

資源共享:多個程序之間共享同樣的資源。

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

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

程序間通訊方式:

管道:匿名管道、命名管道

system v ipc:

posix ipc:

1.管道:半雙工通訊(可選方向的單向傳輸)

本質:核心中的一塊緩衝區

生命週期隨程序

程序間通訊原理:讓多個程序通過訪問相同的緩衝區來實現通訊

匿名管道:只能用於有親緣關係的程序間通訊

乙個程序建立匿名管道,作業系統在核心中重建一塊緩衝區,並返回兩個檔案描述符作為管道的操作控制代碼,乙個用於讀,乙個用於寫

操作介面:

int pipe(int pipefd[2]);

pipefd:至少具有兩個整形元素的陣列

建立乙個管道,通過pipefd獲取系統返回的管道操作控制代碼,其中pipefd[0]用於從管道讀取資料,pipefd[1]用於向管道寫入資料

返回值:成功返回0,失敗返回-1

管道讀寫特性:

若管道中沒有資料,則read會阻塞,直到資料被寫入

若管道中資料滿了,則write會阻塞,直到資料被讀取

若管道的所有讀端被關閉,則write會觸發異常,程序退出

若管道所有寫端被關閉,則read會返回0(所有寫端被關閉)

命名管道:在核心中這塊緩衝區是有標識的,所有的程序都可以通過標識來找到這塊緩衝區

命名管道檔案的開啟特性:

若檔案當前沒有已經被以讀的方式開啟,則以o_wronly開啟時會阻塞

若檔案當前沒有已經被以寫的方式開啟,則以o_rdonly代開時會阻塞

命名管道的讀寫特性:同匿名管道

管道: 分類:匿名管道,命名管道

特性:半雙工通訊

管道的讀寫特性,命名管道開啟特性

管道的生命週期隨程序

管道自帶同步與互斥(管道讀寫資料大小不超過pipe_buf時是安全的)

管道提供位元組流服務(傳輸靈活,但是會出現粘包問題---資料沒有明顯間隔)

2、共享記憶體

最快的程序間通訊方式(資料傳遞不涉及核心),主要用於程序間的資料共享

原理:申請一塊物理記憶體,將這塊物理記憶體通過頁表對映到程序的虛擬位址空間中,接下來程序

通過虛擬位址訪問這塊物理記憶體,多個程序對映同一塊物理記憶體可以通過這塊記憶體實現資料共享

流程:建立共享記憶體 shmget()

將共享記憶體對映到虛擬位址空間 shmat()

直接通過虛擬位址進行記憶體操作

解除對映關係 shmdt()

3、訊息佇列:用於多個程序間有型別的資料塊傳輸

原理:核心中的乙個優先順序佇列

生命週期:生命週期隨核心

ipcs:檢視ipc

-m 檢視共享記憶體

-s 檢視訊號量

-q 檢視訊息佇列

ipcrm 刪除ipc

4、訊號量:用於實現程序間的同步與互斥操作

同步:保證多個程序之間對臨界資源訪問的時序合理性

互斥:程序之間同一時間對臨界資源訪問的唯一性

本質:核心中的乙個計數器(資源計數,統計有多少資源,判斷能否進行操作)+等待佇列

原理:程序對臨界資源訪問前先進行資源技術判斷

Linux程序間通訊

程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...