IPC 方法分類
程式間通訊
shell out
-
被呼叫程式在執行完畢之前接管使用者的鍵盤和顯示,退出後,呼叫程式重新控制鍵盤和顯示並繼續執行。
-
專門程式通常有檔案系統與父程式進行通訊,方法是在指定位置讀取或修改檔案;
編輯器或郵件器的
shellout
就是這樣工作的。
管道、重定向和過濾器
管道
- 單向
- 通常有兩個
I/O
資料流可用:標準輸入和標準輸出。
Unix shell 支援重定向操作
ls > foo
把ls
命令的輸出寫入到foo
檔案內。
wc < foo
將foo
內容作為wc
檔案的輸入。
ps | more
ps
輸出將被分頁,根據顯示器尺寸顯示。
包裝器
包裝器常常源於需要制定引數來修改被呼叫程式的行為。
Bernstein 鏈
和管道類似,不過每個繼發階段的程式取代了前一階段的程式,並不是與之並行。
- 類似於流程圖,層層傳遞的流程。
- 不能重回上一個流程。
從程式
主從程式通過內部處理狀態處理他們之間的協議以避免發生死鎖和競爭。
比 shellout 更復雜更難以除錯
互動的條件:
- 兩者之間涉及的協議完全無足輕重;
- 從程式是為應用協議進行通訊而設計的。
- 允許主程式支援命令列開關或者環境變數的方式來允許呼叫則設定自己的從程式命令;
- 一定程度上對從程式進行監控;
以上這些都將有利於除錯,便利於開發。
對等程式間通訊
臨時檔案
缺點:
- 臨時檔案被刪除前,程式被中斷,檔案將成為遺留垃圾資料;
- 如果程式中的多個例項使用同一檔名稱作為臨時檔名,將導致衝突。
- 安全性:如果攻擊程式知道臨時檔案要寫入的位置,可以覆蓋整個檔案,可能讀取生產者的程式資料,或者通過檔案中插入修改,造假資料欺騙消費者程式。
優點:
- 容易建立
- 不容易產生死鎖和競爭
訊號
- 一個程式向另一個程式傳送訊號(Unix 的訊號是一種軟中斷形式,每個訊號都對接受程式產生預設作用【通常是殺掉這個程式】)
套接字
通過套接字通訊的兩個程式通常都存在雙向位元組流。
- 位元組流既是按序的,又是可靠的。
- 套接字描述符一旦獲得,行為基本上和檔案描述符一樣。
要優雅地使用套接字,在 Unix 傳統中,首先得設計這些套接字之間使用的應用協議--即一套請求和相應,能夠簡潔地表達程式通訊的語義。
例項:PostgreSQL(DB) Freeciv
共享記憶體
要求生產者和消費者程式必須在同一硬體上。
使用共享記憶體和訊號量功能可避免通過網路棧複製資料的開銷。