1. 程式人生 > >IPC實現機制(一)---pipe(匿名管道)

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)求管道的容量大小:
寫段一直寫,而讀段不讀,且讀段開啟;
這裡寫圖片描述