1.進程間通信介紹
1.1通信目的
數據傳輸:?個進程需要將它的數據發送給另?個進程
資源共享:多個進程之間共享同樣的資源。
通知事件:?個進程需要向另?個或?組進程發送消息,通知它(它們)發?了某種事件(如進 程終?時要通知?進程)。
進程控制:有些進程希望完全控制另?個進程的執?(如Debug進程),此時控制進程希望能夠 攔截另?個進程的所有陷?和異常,并能夠及時知道它的狀態改變。
1.2進程間通信發展
管道
System V進程間通信
POSIX進程間通信
1.3進程間通信分類
管道:
匿名管道pipe
命名管道
System V IPC :
System V 消息隊列
System V 共享內存
System V 信號量
POSIX IPC :
消息隊列
共享內存
信號量
互斥量
條件變量
讀寫鎖
2.管道
管道是Unix中最古?的進程間通信的形式。
我們把從?個進程連接到另?個進程的?個數據流稱為?個“管道”
3.匿名管道
3.1示例代碼
3.2用fork來共享管道原理
3.3站在?件描述符?度-深度理解管道
3.4站在內核?度-管道本質
3.5管道樣例
3.5.1測試管道讀寫
3.5.2創建進程池處理任務
登錄 - Gitee.com
3.6管道讀寫規則
當沒有數據可讀時
O_NONBLOCK disable:read調?阻塞,即進程暫停執?,?直等到有數據來到為?。
O_NONBLOCK enable:read調?返回-1,errno值為EAGAIN
當管道滿的時候
O_NONBLOCK disable:write調?阻塞,直到有進程讀?數據
O_NONBLOCK enable:調?返回-1,errno值為EAGAIN
如果所有管道寫端對應的?件描述符被關閉,則read返回0
如果所有管道讀端對應的?件描述符被關閉,則write操作會產?信號SIGPIPE,進?可能導致 write進程退出
當要寫?的數據量不?于PIPE_BUF時,linux將保證寫?的原?性。
當要寫?的數據量?于PIPE_BUF時,linux將不再保證寫?的原?性。
3.7管道特點
只能?于具有共同祖先的進程(具有親緣關系的進程)之間進?通信;通常,?個管道由?個進 程創建,然后該進程調?fork,此后?、?進程之間就可應?該管道。
管道提供流式服務
?般??,進程退出,管道釋放,所以管道的?命周期隨進程
?般??,內核會對管道操作進?同步與互斥
管道是半雙?的,數據只能向?個?向流動;需要雙?通信時,需要建?起兩個管道
3.8管道通信的4中情況
讀正常&&寫滿
寫正常&&讀空
寫關閉&&讀正常
讀關閉&&寫正常
4.命名管道
管道應?的?個限制就是只能在具有共同祖先(具有親緣關系)的進程間通信。
如果我們想在不相關的進程之間交換數據,可以使?FIFO?件來做這項?作,它經常被稱為命名 管道。
命名管道是?種特殊類型的?件
4.1創建一個命名管道
4.2匿名管道和命名管道的區別
匿名管道由pipe函數創建并打開。
命名管道由mkfifo函數創建,打開?open
IFO(命名管道)與pipe(匿名管道)之間唯?的區別在它們創建與打開的?式不同,?但這些 ?作完成之后,它們具有相同的語義。
4.3命名管道的打開原則
如果當前打開操作是為讀?打開FIFO時:
O_NONBLOCK disable:阻塞直到有相應進程為寫?打開該FIFO
O_NONBLOCK enable:?刻返回成功
如果當前打開操作是為寫?打開FIFO時:
O_NONBLOCK disable:阻塞直到有相應進程為讀?打開該FIFO
O_NONBLOCK enable:?刻返回失敗,錯誤碼為ENXIO
實例1.?命名管道實現?件拷?
讀取?件,寫?命名管道:
讀取管道,寫??標?件:
實例2.?命名管道實現server&client通信
5.system V共享內存
共享內存區是最快的IPC形式。?旦這樣的內存映射到共享它的進程的地址空間,這些進程間數據傳遞 不再涉及到內核,換句話說是進程不再通過執?進?內核的系統調?來傳遞彼此的數據
5.1共享內存示意圖
5.2共享內存數據結構
5.3共享內存函數
實例1.共享內存實現通信
測試代碼結構
實例2.借助管道實現訪問控制版的共享內存
?6.system V 消息隊列
消息隊列提供了?個從?個進程向另外?個進程發送?塊數據的?法
每個數據塊都被認為是有?個類型,接收者進程接收的數據塊可以有不同的類型值
特性??:
PC資源必須刪除,否則不會?動清除,除?重啟,所以systemVIPC資源的?命周期隨內核
7system V 信號量
信號量主要?于同步和互斥的,下?先來看看什么是同步和互斥。
7.1并發編程,概念鋪墊
多個執?流(進程),能看到的同?份公共資源:共享資源
被保護起來的資源叫做臨界資源
保護的?式常?:互斥與同步
任何時刻,只允許?個執?流訪問資源,叫做互斥
多個執?流,訪問臨界資源的時候,具有?定的順序性,叫做同步
系統中某些資源?次只允許?個進程使?,稱這樣的資源為臨界資源或互斥資源。
在進程中涉及到互斥資源的程序段叫臨界區。你寫的代碼=訪問臨界資源的代碼(臨界區)+不訪問 臨界資源的代碼(?臨界區)
所謂的對共享資源進?保護,本質是對訪問共享資源的代碼進?保護
7.2信號量
特性??:
IPC資源必須刪除,否則不會?動清除,除?重啟,所以systemVIPC資源的?命周期隨內核
理解??:
信號量是?個計數器
作???:
保護臨界區
本質??:
信號量本質是對資源的預訂機制
操作??:
申請資源,計數器--,P操作
釋放資源,計數器++,V操作