程序間通訊的目的:
資料傳輸:乙個程序需要將它的資料傳送給另乙個程序
資源共享:多個程序之間共享同樣的資源。
通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知它(它們)發生了某種事件(如程序終止時要通知父程序)。
程序控制:有些程序希望完全控制另乙個程序的執行(如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.管道與...