嵌入式學(xue)習筆(bi)記(ji):進程間的(de)通信方(fang)式總(zong)結
時間:2018-09-04 來源:未(wei)知(zhi)
進程(cheng)間(jian)的通信(xin)方式分(fen)為很(hen)多(duo)種(zhong),學(xue)習這(zhe)個就要從(cong)這(zhe)幾(ji)方面來入手(shou),不妨一(yi)看
【1】常見的進程間通信方(fang)式(shi)(7種)
【2】無名管道
【3】(FIFO)有(you)名管道(dao)
【4】信號(hao)signal
【1】常見的進程(cheng)間通信方式(7種(zhong))
1)傳統的(de)進(jin)程間通(tong)信方(fang)式
無名(ming)管道(pipe)
有名管道(fifo)
信號(hao)(signal)---- 異步通信
2)System V IPC (Inter-Process Communication)
消(xiao)息隊列(message queue)
共享內(nei)存(share memory)
信號燈集(semaphore)
3)BSD
套(tao)接字(zi)(socket)
【2】無名管道
1)簡介:
在內核(he)空間(jian)開辟一塊區域,并向進(jin)程提供兩(liang)個文件描述(shu)符fd[0],fd[1]; fd[0]:固定(ding)用于讀(du)管(guan)道
fd[1]:固定用于寫管道(dao)
先進先出模式,消息被讀取后則刪(shan)除
在使用(yong)無名管道時,應(ying)創建(jian)無名管道,在使用(yong)fork()函數創建(jian)子進程(cheng);
2)特點:
1)只能用于具有親緣關系的父(fu)子進程之間通(tong)信
2)半雙工的通行模式,具有固定的讀端和寫斷
3)管(guan)道可以看成時一種特殊文件,對于(yu)它的讀寫可以使用文件I/O(管(guan)道建立在(zai)內核空間,
必須使用文(wen)件IO進行訪問)(不(bu)支(zhi)持(chi)lseek函數)
4)讀(du)操作被阻塞:當管道(dao)中沒(mei)有數據時
寫(xie)操作被(bei)阻塞:管(guan)道被(bei)寫(xie)滿(man)時(管(guan)道大小為64K);5)管(guan)道破(po)裂:管(guan)道讀端被(bei)關(guan)閉,再向管(guan)道中寫(xie)入數據時,
即向管道寫入(ru)數據(ju)的進程(cheng)會收到來(lai)自內核發送的SIGPIPE信號(hao)6)數據(ju)存(cun)(cun)放于內存(cun)(cun)中(zhong),讀取后就(jiu)不(bu)存(cun)(cun)在了

3)使用步驟:

在(zai)對管道內的數據進行操作(zuo)時,必須使(shi)用文(wen)件IO,在(zai)對用戶空間(jian)的數據進行操作(zuo)時,可以(yi)使(shi)用標準IO(擇(ze)優選擇(ze));

【3】(FIFO)有(you)名管道
1)簡介
在內核開(kai)辟一塊空間,用來(lai)(lai)存儲數據(ju),但(dan)是此空間通過存儲在磁盤(pan)空間的文(wen)件名來(lai)(lai)操(cao)作;
先(xian)進先(xian)出模式(shi),消息被讀取后則刪(shan)除

2)特點
1)可以使(shi)互不相(xiang)關的(de)兩個進(jin)程互相(xiang)通信,有(you)名管道可以通過路徑(jing)名來指出(chu),并且在(zai)文件系(xi)統中可見
2)進程通過文件IO來操作(zuo)有名管(guan)道,內(nei)容存(cun)放在內(nei)存(cun)中
3)不支(zhi)持lseek()操作
4)其它與無名管道一樣。
5)讀操作被(bei)阻塞:當管(guan)道中沒有數(shu)據(ju)時
寫操作(zuo)被阻塞:管(guan)道被寫滿時(管(guan)道大小為64K);
6)有名管道(dao)在被創建后,顯示大小為(wei)0(因為(wei)其存放在內存中)
7)有名管道文件在被單獨(du)打開時(無論讀/寫(xie))都(dou)會(hui)阻塞,直到(dao)讀端和寫(xie)端都(dou)被打開時停止阻塞
3)有名管道的阻塞(sai)問題
由于普通(tong)文件的(de)讀(du)寫(xie)時不會出(chu)現阻塞問題,而在(zai)管道的(de)讀(du)寫(xie)中卻有(you)阻塞的(de)可能,這里的(de)非阻塞標志可以在(zai)open()函(han)數中設定為O_NONBLOCK。
對于O_RDONLY、 O_WRONLY、 O_NONBLOCK有4種組(zu)合方式:
1、open(const char *path,O_RDONLY)
在這種情況下,open 調用將阻塞,除非有一個進(jin)程以寫方式打開(kai)同一個FIFO,否則它不(bu)會返回
2、open(const char *path,O_RDONLY|O_NONBLOCK )
即使沒有其它(ta)進程以(yi)寫方式打開(kai)FIFO,這open調 用也將成功并(bing)馬上(shang)返(fan)回3、open(const char *path,O_WRONLY)
open調用將阻塞,直到有一個進程以(yi)讀方式打開同一個 FIFO為(wei)止(zhi)。
4、open(const char *path,O_WRONLY|O_NONBLOCK )
open調(diao)用(yong)總(zong)是立(li)刻返回,便如(ru)果沒有(you)進程以讀方(fang)式(shi)打開FIFO文(wen)件(jian), open調(diao)用(yong)將返回一個錯誤(-1)并且FIFO也不會被打開。
對于讀進程
• 若(ruo)該管(guan)道是阻塞打開,且當前FIFO內沒有(you)數據,則對讀進程而言(yan)將一直阻塞到(dao)有(you)數據寫入。
• 若該管(guan)道(dao)是非阻塞打開(kai),則不論FIFO內是否有數據,讀進程都(dou)會立即執(zhi)行讀操作。對(dui)于寫進程
• 若該管道是(shi)阻塞打開,則寫操作將(jiang)一直(zhi)阻塞到數據(ju)可以被(bei)寫入。
• 若(ruo)該管道是非阻塞(sai)打開而不(bu)能寫入全部數據,則讀操作(zuo)進(jin)行部分寫入或者調用失敗。

4)使用(yong)步驟:
1)先(xian)在(zai)某(mou)一個進程中使用mkfifo()在(zai)內核空間中創(chuang)建(jian)有名管道(在(zai)文件系統中
可見)
2)在(zai)需要使(shi)用有名管道的(de)進程中通過 open()打開文件
3)使用文件IO對有名管道(dao)進行訪(fang)問
5)相關函數(shu)

【4】信號signal
1)簡介
信號是在軟件(jian)層次(ci)上對中斷機制(zhi)的(de)一(yi)種(zhong)模擬(ni),是唯一(yi)一(yi)種(zhong)異步(bu)通(tong)信方(fang)式
信(xin)號可以(yi)直接進(jin)行(xing)用戶空間進(jin)程和(he)內核進(jin)程之(zhi)間的交互,內核進(jin)程也可以(yi)利用它(ta)來通知用戶空間進(jin)程發生了哪些系統事件
如果進(jin)程當(dang)前未(wei)處于執(zhi)行(xing)態(tai),則該(gai)信號就由內核(he)保存起來,直(zhi)到該(gai)進(jin)程恢復執(zhi)行(xing)再傳遞(di)給它
linux內核通過(guo)信(xin)(xin)號(hao)通知用戶進程,不同(tong)的信(xin)(xin)號(hao)類型代表不同(tong)的事(shi)件(jian)
如果一個進程被設置為阻(zu)塞,則(ze)該信號的(de)傳遞被延遲,直到其阻(zu)塞被取消時才(cai)被傳遞給進程

用戶進程對信(xin)號的(de)響應方式(shi):
忽略信(xin)(xin)(xin)號(hao):對(dui)信(xin)(xin)(xin)號(hao)不做任何處理,但是有兩個信(xin)(xin)(xin)號(hao)不能被忽略:SIGKILL和SIGSTOP捕捉信(xin)(xin)(xin)號(hao):定(ding)義函(han)數處理信(xin)(xin)(xin)號(hao),當信(xin)(xin)(xin)號(hao)發生時,自行相應(ying)的(de)處理函(han)數執(zhi)行缺省操作:Linux對(dui)每種信(xin)(xin)(xin)號(hao)都規定(ding)了默認操作
kill -l 34(SIGRTMIN)-64(SIGRTMAX) 可靠(kao)信(xin)(xin)號 信(xin)(xin)號可以(yi)被內核保(bao)存萬次(ci)(ci) 而(er)其他信(xin)(xin)號只會被保(bao)存一次(ci)(ci),如果(guo)程(cheng)(cheng)序處于(yu)暫停態,且需多次(ci)(ci)接受相同信(xin)(xin)號,內核相同的(de)信(xin)(xin)號只會發送(song)一次(ci)(ci)給程(cheng)(cheng)序。
kill [-signal] pid 默認發(fa)送SIGTERM(15)終止進程(cheng) -signal指(zhi)定信號(hao) pid指(zhi)定發(fa)送對
象
killall [-u user | prog] prog指定(ding)進程(cheng)號 user指定(ding)用戶名






