IPC 進程間通訊方式——管道
進程間通訊概述
- 數據傳輸:一個進程須要將它的數據發送給另外一個進程,發送的數據量在一個字節到幾兆字節之間
- 共享數據:多個進程想要操做共享數據,一個進程對共享數據的修改,別的進程應該馬上看到。
- 通知時間:一個進程須要向另外一個或一組進程發送消息,通知他們發生了某些事件(如進程終止時要通知父進程)
- 資源共享:多個進程之間共享一樣的資源,爲了作到這一點,須要內核提供鎖和同步機制
- 進程控制:有些進程但願徹底控制另外一個進程的執行(如Debug進程),此時控制進程但願可以攔截另外一個進程的全部陷入的異常,並可以及時指導它的狀態改變。
進程間通訊方式
- 管道(pipe),有名管道(FIFO)
- 信號(signal)
- 消息隊列
- 共享內存
- 信號量
- 套接字(socket)
管道
- 管道針對本地計算機的兩個進程之間的通訊而設計的通訊方式,管道創建後,實際得到兩個文件描述符:一個用於讀取另外一個用於寫入。
- 常見的IPC機制,經過pipe系統調用。
- 管道單工,數據只能向一個方向流動。雙向通訊時,須要創建兩個管道。
- 數據的讀出和寫入:一個進程向管道中寫的內容被管道另外一端的進程讀出。寫入的內容每次都添加在管道的緩衝區的尾部,每次都是從緩衝區的頭部讀出數據。
管道的分類
- 匿名管道
- 關係進程,父子或兄弟
- 由pipe系統調用,管道由父進程創建
- 管道位於內核空間,實際上是一塊緩存
- 有名管道(FIFO)
- 兩個沒有任何關係的進程之間通訊可經過有名管道進行數據傳輸
- 經過系統調用mkfifo建立
管道建立
#include<unistd.h>
int pipe(int fd[2]);
//返回:0成功,-1出錯
- 兩個文件描述符數組
- fd[0]:pipe的讀端
- fd[1]:pipe的寫端
歡迎關注本站公眾號,獲取更多信息