IPC實現機制(一)---pipe(匿名管道)
一.IPC簡介:
(1)概念:
每個程序各⾃有不同的⽤戶地址空間,任何⼀個程序的全域性變數在另⼀個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢⼀塊緩衝區,程序1把資料從⽤戶空間拷到核心緩 衝區,程序2再從核心緩衝區把資料讀⾛,核心提供的這種機制稱為程序間通訊
(IPC,InterProcess Communication)
(2)常用的程序間通訊方式:
- 傳統的程序間通訊方式
無名管道(pipe)、有名管道(fifo)和訊號(signal) - System v IPC物件
共享記憶體(share memory)、訊息佇列(message queue)和訊號量
C.BSD - 套接字(socket)
本篇文章只講解pipe(匿名管道)
(3)不同程序間的通訊本質:
程序之間可以看到一份公共資源;而提供這份資源的形式或者提供者不同,造成了通訊方式不同,而 pipe就是提供這份公共資源的形式的一種。
二.pipe講解
(1)管道的建立:
管道是最基本的IPC機制;管道的建立由pipe()函式實現:
(2)管道具體實現程序間通訊過程
- 父程序建立管道,得到兩個⽂件描述符指向管道的兩端
- 父程序fork出子程序,⼦程序繼承父程序的檔案描述符表,也有兩個⽂件描述符指向同⼀管道。
父程序關閉fd[0],子程序關閉fd[1],即⽗程序關閉管道讀端,⼦程序關閉管道寫端(因為管道只支援單向通訊
(3)程式碼實現pipe程序間通訊
(4)使用管道時四種特殊情況(設都是阻塞I/O操作,沒有設定O_NONBLOCK標誌):情況一:寫端描述符f[1]關閉;讀端一直讀;
- 情況二:寫端描述符f[1]不關閉,但寫端不寫;讀端一直讀;
- 情況三:讀端描述符f[0]關閉;寫端一直寫;
- 情況四:讀端描述符f[0]不關閉,但讀端不讀;寫端一直寫;
總結:
如果一個管道的寫端一直在寫,而讀端的引⽤計數是否⼤於0決定管道是否會堵塞,引用計數大於0,只寫不讀再次呼叫write會導致管道堵塞;
如果一個管道的讀端一直在讀,而寫端的引⽤計數是否⼤於0決定管道是否會堵塞,引用計數大於0,只讀不寫再次呼叫read會導致管道堵塞;
而當他們的引用計數等於0時,只寫不讀會導致寫端的程序收到一個SIGPIPE訊號,導致程序終止,只寫不讀會導致read返回0,就像讀到⽂件末尾⼀樣。
(4)管道特點
-1.管道只允許具有血緣關係的程序間通訊,如父子程序間的通訊。
-2.管道只允許單向通訊。
-3.管道內部保證同步機制,從而保證訪問資料的一致性。
-4.面向位元組流
-5.管道隨程序,程序在管道在,程序消失管道對應的埠也關閉,兩個程序都消失管道也消失。
(4)求管道的容量大小:
寫段一直寫,而讀段不讀,且讀段開啟;