久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 關于進程間通信

關于進程間(jian)通(tong)信 時(shi)間:2018-09-21      來源:未知

在(zai)之(zhi)前的總(zong)結中我(wo)們已經(jing)總(zong)結了線程(cheng)間(jian)通信的方式和提(ti)點,下面這篇(pian)博(bo)文(wen)我(wo)們來總(zong)結下進程(cheng)間(jian)通信的方式方法和特點。同樣我(wo)們不把函數作為重點,重點在(zai)于對特征(zheng)的中介。

進(jin)程(cheng)間通(tong)信(IPC)的方式(shi)很多。下(xia)面進(jin)行歸類(lei)總結。

在傳統的(de)(de)(de)進(jin)程(cheng)間(jian)(jian)(jian)通(tong)信(xin)(xin)中有 無名(ming)管道(dao),有名(ming)管道(dao),信(xin)(xin)號通(tong)信(xin)(xin)。后來system v 退(tui)出(chu)了自己(ji)(ji)的(de)(de)(de)IPC 方(fang)(fang)式 消(xiao)(xiao)息(xi)隊列(lie),共(gong)享內存和信(xin)(xin)號燈(deng)集合(he)但(dan)是system v的(de)(de)(de)通(tong)信(xin)(xin)方(fang)(fang)式也(ye)存在自己(ji)(ji)的(de)(de)(de)缺(que)點。POSIX 在此基礎上退(tui)出(chu)了自己(ji)(ji)的(de)(de)(de)posix的(de)(de)(de)消(xiao)(xiao)息(xi)隊列(lie),共(gong)享內存和信(xin)(xin)號燈(deng)集。另外,進(jin)程(cheng)間(jian)(jian)(jian)還(huan)(huan)可(ke)以(yi)通(tong)過(guo)對文件的(de)(de)(de)操作(zuo)實現溝(gou)通(tong),這里用到了文件鎖。還(huan)(huan)有后期的(de)(de)(de)內存映射方(fang)(fang)式。在網絡上BSD率先提出(chu)了socket的(de)(de)(de)方(fang)(fang)法,成為(wei)后來為(wei)流(liu)行的(de)(de)(de)套接字通(tong)信(xin)(xin)方(fang)(fang)式,這種方(fang)(fang)式既可(ke)以(yi)在本機(ji)上的(de)(de)(de)進(jin)程(cheng)間(jian)(jian)(jian),也(ye)可(ke)以(yi)在網絡上。

IPC 通信工具(ju)分類

下(xia)面對(dui)我們(men)常用的集中進(jin)程(cheng)間(jian)通(tong)信(xin)方式(shi)的特征進(jin)行總結(jie)

pipe

1.32位linux系(xi)統(tong)下(xia)默認大小為64M

2.如果寫滿會阻塞知道有人讀走(zou)再寫

3.如果讀寫(xie)都有那么寫(xie)不(bu)會影響,讀的話會阻塞

4.如果沒有(you)讀端(duan)那么(me)管道(dao)寫入后會管道(dao)破裂發送(song)一個信(xin)號SIGPIPE導致(zhi)進(jin)程結束

5.如果(guo)沒有寫(xie)端那么管道讀取(qu)會退(tui)出(chu),如果(guo)管道里有東西那么會先讀出(chu)來然后退(tui)出(chu)

6.fd[0]為讀端 fd[1]為寫端是固定(ding)的

7.Pipe創建之后(hou),在內核中。當(dang)所有的(de)讀端和寫端都關閉的(de)時候,pipe將(jiang)被釋(shi)放掉(diao)

fifo

mkfifo既是(shi)函數又是(shi)命令

1.fifo不能用標準IO操(cao)作。適用于非親(qin)緣關系的進程間(jian),大為64M

2.fifo的打開有只讀只寫方式(shi)

如果只讀(du)方(fang)(fang)式打開沒有寫(xie)端(duan)會阻塞(sai)(sai),如果只寫(xie)方(fang)(fang)式沒有讀(du)端(duan)會阻塞(sai)(sai)這種阻塞(sai)(sai)是以open處阻塞(sai)(sai)。

如果以讀(du)寫(xie)方(fang)式打(da)開則不會(hui)阻塞,但是我們一(yi)般不會(hui)這樣做,用(yong)fifo更(geng)多用(yong)來(lai)多個進程間進行單向的通(tong)信

3.fifo 文(wen)件(jian)不能通過lseek函(han)數進行(xing)操作,管道屬(shu)于 內(nei)核(he)空間(jian)開(kai)辟(pi),如果讀寫端都關閉那么(me)內(nei)容會被清除

4.可以(yi)通過打(da)(da)開(kai)時候設置全新啊(a)O_NONBLOCK 將打(da)(da)開(kai)方(fang)式(shi)設置為非阻塞模式(shi),這(zhe)種模式(shi)打(da)(da)開(kai)的時候如果另一端已經打(da)(da)開(kai)那么沒有(you)影響

 如果非阻塞(sai)為讀(du),而寫段沒打開,那(nei)么讀(du)同樣(yang)會成功(gong)(就是不會open處阻塞(sai))

如果非阻塞為寫(xie),而讀端沒有打開,那么(me)會返(fan)回一個錯(cuo)誤信號管道(dao)破(po)裂ENXIO open調用失敗

信號 

1.引(yin)起內核產(chan)生信(xin)號的(de)事(shi)(shi)件 硬件異常 終端輸入特殊字符(fu) 軟件事(shi)(shi)件如定時器到期,窗口(kou)改變

2.信(xin)號的(de)(de)默認操作(zuo) :忽略信(xin)號 終止進程(cheng) 暫(zan)停進程(cheng) 對之(zhi)前暫(zan)停的(de)(de)進程(cheng)重新啟動

3.信號是一種(zhong)異步(bu)行為

共享內存

1.共享內(nei)(nei)(nei)存(cun)是(shi)一(yi)種(zhong)為高(gao)效的(de)進(jin)程間通信方式,內(nei)(nei)(nei)核專門留出(chu)的(de)一(yi)塊內(nei)(nei)(nei)存(cun)區(qu)域,這塊內(nei)(nei)(nei)存(cun)可(ke)以由需(xu)要(yao)(yao)的(de)訪問(wen)的(de)進(jin)程將其(qi)映射到自己的(de)私有空間,因(yin)此進(jin)程可(ke)以直接讀取數據不需(xu)要(yao)(yao)復制,所以提高(gao)了效率

2.key值(zhi)是一(yi)(yi)個非負整數,通(tong)常(chang)生(sheng)成(cheng)的(de)方法是有ftok生(sheng)成(cheng)(傳(chuan)入一(yi)(yi)個文(wen)件,和一(yi)(yi)個整數,通(tong)過(guo)inod節點(dian)結合(he)算法)。這樣(yang)同(tong)樣(yang)的(de)參數確保生(sheng)成(cheng)的(de)key一(yi)(yi)樣(yang),而不同(tong)的(de)傳(chuan)入產生(sheng)不同(tong)的(de)key。這樣(yang)可以確保打(da)開(kai)相同(tong)的(de)key即(ji)指向相同(tong)的(de)共享內存(或(huo)者(zhe)消息(xi)隊列或(huo)者(zhe)信(xin)號量(liang))。這是一(yi)(yi)種成(cheng)熟(shu)的(de)技術(shu)

3.共享內存多個進程可以對其(qi)操作,因此需要(yao)同步互斥(chi)機制

4.生成key---創建或打開---映(ying)射---解除(chu)映(ying)射----刪除(chu) 這是(shi)共(gong)享(xiang)內存使用的一(yi)般步驟(zou)

5.映(ying)射后一個參(can)數可(ke)設置(zhi)只讀,0表示可(ke)讀可(ke)寫

6.創(chuang)建時(shi)候key如果設置(zhi)成私有(you)的(de),那(nei)么只(zhi)有(you)在這個進程中可用,對進程間通(tong)信沒有(you)多大(da)意義

7.共享內存的大小(xiao)限制: usr/include/linux/shm.h中

#define SHMMAX 0x2000000 大32MB

#define SHMMIN 1 小1個字節

消息隊列

1.消息隊列中一次只(zhi)能讀(du)取一條(tiao)消息,不能一次讀(du)取多條(tiao)或者不到一條(tiao)

2.消息隊列中的消息既可(ke)以(yi)按照先(xian)進先(xian)出讀取也可(ke)以(yi)按照類型

3.msgsnd 發(fa)送(song)(song)消(xiao)息事(shi)后,第三個參(can)數(shu)為(wei)消(xiao)息的字節(jie)數(shu),一次發(fa)送(song)(song)一個消(xiao)息所以返(fan)回為(wei)0,而不需要為(wei)發(fa)送(song)(song)的字節(jie)數(shu),

第四(si)個參數(shu)可(ke)以設置為非阻塞模(mo)式IPC_NOWAIT,這(zhe)樣當消息隊列滿的時候(hou)會立即(ji)返回EAGAIN錯誤

4 msgrcv 也可以(yi)設(she)置(zhi)非阻塞模式(shi),,如果阻塞那么消息隊列(lie)中沒(mei)有消息會(hui)阻塞,如果設(she)置(zhi)為(wei)非阻塞則(ze)立即返回ENOMSG錯(cuo)誤

5.消息隊列和共(gong)享內(nei)存(cun)如果不手動(dong)釋放(fang)不會(hui)隨進程結束,除非系(xi)統重啟

6.消息隊列結構體重的消息類型項(xiang)必須為第一(yi)項(xiang)

信號

1.信號量更多是用來同(tong)步進(jin)程間資源的,如共(gong)享內存。也可以同(tong)步父子進(jin)程的執行

2信號燈限制(zhi): usr/include/linux/sem.h中(zhong)

semget申請的(de)信號燈的(de)編號從0開始

semctl中的(de)cmd 命令的(de)常用(yong)用(yong)法(fa)

另外(wai)在poxis中也有消息(xi)隊列,共享內存和信號量的機制

消(xiao)(xiao)(xiao)息隊列中system v 的(de)移植性比較好,可(ke)以選擇(ze)消(xiao)(xiao)(xiao)息類型,但是poxis 的(de)消(xiao)(xiao)(xiao)息隊列可(ke)以被poll select 等(deng)進行監(jian)聽

共(gong)(gong)享內(nei)存(cun)中system v 的(de)支持范圍比較(jiao)廣泛,但(dan)是poxis 不必再創建時(shi)候就(jiu)定(ding)下共(gong)(gong)享內(nei)存(cun)的(de)大小

信(xin)號量(liang)中 poxis 有些像線(xian)程的(de)信(xin)號量(liang),通過相互通知的(de)機制進行pv操(cao)作,相對而言不那么復雜。system v中是定義一個信(xin)號量(liang)的(de)集合

上一篇:關于線程間通信

下一篇:STM32F407和STM32F051主從I2C通信

熱點文章推薦(jian)
華清(qing)學員(yuan)就業榜(bang)單
高薪學員經驗分享
熱點新聞(wen)推(tui)薦
前臺專(zhuan)線:010-82525158 企業(ye)培訓洽(qia)談專線:010-82525379 院(yuan)校(xiao)合作(zuo)洽談專線(xian):010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部