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)求管道的容量大小:
寫段一直寫,而讀段不讀,且讀段開啟;
相關文章
- IPC(一)---------匿名管道
- 匿名管道通訊實現
- Android IPC 機制分析Android
- 對於Pipe管道之愛 - jessfraz
- OpenCL中的管道cl::Pipe的使用
- linux程式間通訊--管道(PIPE & FIFO)Linux
- 學習筆記(2)IPC機制筆記
- 02.Android之IPC機制問題Android
- Redis學習之管道機制Redis
- Android IPC機制(三):淺談Binder的使用Android
- Binder通訊機制與IPC通訊.md
- Linux的管道機制和重定向Linux
- Swoole 原始碼分析——基礎模組之 Pipe 管道原始碼
- 老司機帶你實現 Laravel 之管道Laravel
- 詳解 Android 中的 IPC 機制:基礎篇Android
- ASP.NET Core 中的管道機制ASP.NET
- Linux系統程式設計之匿名管道Linux程式設計
- Linux 核心最新高危提權漏洞:髒管道 (Dirty Pipe)Linux
- 實現一個“計劃任務”機制
- 匿名網路追蹤溯源機制及方法
- 在Linux中,管道(pipe)和重定向(redirection)的是什麼?Linux
- 深入探究Immutable.js的實現機制(一)JS
- Python並行程式設計(九):多程式物件交換之pipe(管道)實現生產者-消費者模型Python並行行程程式設計物件模型
- Windows程式通訊之一看就懂的匿名管道通訊Windows
- Spring AOP 的實現機制Spring
- Spring IOC容器實現機制Spring
- NodeJS實現websocket代理機制NodeJSWeb
- NX實現機制淺析
- MySQL中的MVCC實現機制MySqlMVC
- docker 實現 Redis 的哨兵機制DockerRedis
- Js非同步機制的實現JS非同步
- Objective-C block 實現機制ObjectBloC
- Android RollBack機制實現原理剖析Android
- scala中的匿名子類實現
- 併發機制的底層實現
- Nginx accept鎖的機制和實現Nginx
- Istio流量管理實現機制深度解析
- javascript事件機制底層實現原理JavaScript事件
- Golang利用select實現超時機制Golang