處理序間通訊 --- IPC
1. 處理序間通訊的目的
a. 資料轉送: 一個進程需要將他的資料發送給另一個進程
b. 資源共用: 多個進程之間共用同樣的資源
c. 通知事件: 一個進程需要向另一個或一組進程發送訊息,通知它們發生了某種事件。
d. 進程式控制制: 有些進程希望完全控制另一個進程的執行(如debug進程),此時控制進程希望能攔截另一個進程的所有操作,並能夠及時直到它的狀態改變。
2. linux處理序間通訊發展:
linux處理序間通訊(IPC)由以下幾部分發展而來:
a. Unix 處理序間通訊。
b. 基於System V處理序間通訊
c. POSIX處理序間通訊。
3. linux處理序間通訊方式
a. 管道(pipe)和 有名管道(FIFO)
b. 訊號(signal)
c. 訊息佇列
d. 共用記憶體
e. 訊號量
f. 通訊端(socket) Linux下進程通訊的八種方法:管道(pipe),具名管道(FIFO),記憶體映射(mapped memeory),訊息佇列(message queue),共用記憶體(shared memory),訊號量(semaphore),訊號(signal),通訊端(Socket).
(1) 管道(pipe):管道允許一個進程和另一個與它有共同祖先的進程之間進行通訊;(2) 具名管道(FIFO):類似於管道,但是它可以用於任何兩個進程之間的通訊,具名管道在檔案系統中有對應的檔案名稱。具名管道通過命令mkfifo或系統調用mkfifo來建立;(3) 訊號(signal):訊號是比較複雜的通訊方式,用於通知接收進程有某種事情發生,除了用於處理序間通訊外,進程還可以發送訊號給進程本身;Linux除了支援UNIX早期訊號語義函數signal外,還支援語義符合POSIX.1標準的訊號函數sigaction(實際上,該函數是基於BSD的,BSD即能實現可靠訊號機制,又能夠統一對外介面,用sigaction函數重新實現了signal函數的功能);(4) 記憶體映射(mapped memory):記憶體映射允許任何多個處理序間通訊,每一個使用該機制的進程通過把一個共用的檔案對應到自己的進程地址空間來實現它;(5) 訊息佇列(message queue):訊息佇列是訊息的串連表,包括POSIX訊息對和System V訊息佇列。有足夠許可權的進程可以向隊列中添加訊息,被賦予讀許可權的進程則可以讀走隊列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能成該無格式位元組流以及緩衝區大小受限等缺點;(6) 訊號量(semaphore):訊號量主要作為進程間以及同進程不同線程之間的同步手段;(7) 共用記憶體 (shared memory):它使得多個進程可以訪問同一塊記憶體空間,是最快的可用IPC形式。這是針對其他通訊機制運行效率較低而設計的。它往往與其他通訊機制,如訊號量結合使用,以達到進程間的同步及互斥;(8) 通訊端(Socket):它是更為通用的處理序間通訊機制,可用於不同機器之間的處理序間通訊。起初是由UNIX系統的BSD分支開發出來的,但現在一般可以移植到其他類UNIX系統上:Linux和System V的變種都支援通訊端;