色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 學習筆記 > 嵌入式學習筆記:進程間的通信方式總結

嵌入式學習筆記:進程間的通信方式總結 時間:2018-09-04      來源:未知

進程間的通信方式分為很多種,學習這個就要從這幾方面來入手,不妨一看

【1】常見的進程間通信方式(7種)

【2】無名管道

【3】(FIFO)有名管道

【4】信號signal

【1】常見的進程間通信方式(7種)

1)傳統的進程間通信方式

無名管道(pipe)

有名管道(fifo)

信號(signal)---- 異步通信

2)System V IPC (Inter-Process Communication)

消息隊列(message queue)

共享內存(share memory)

信號燈集(semaphore)

3)BSD

套接字(socket)

【2】無名管道

1)簡介:

在內核空間開辟一塊區域,并向進程提供兩個文件描述符fd[0],fd[1]; fd[0]:固定用于讀管道

fd[1]:固定用于寫管道

先進先出模式,消息被讀取后則刪除

在使用無名管道時,應創建無名管道,在使用fork()函數創建子進程;

2)特點:

1)只能用于具有親緣關系的父子進程之間通信

2)半雙工的通行模式,具有固定的讀端和寫斷

3)管道可以看成時一種特殊文件,對于它的讀寫可以使用文件I/O(管道建立在內核空間,

必須使用文件IO進行訪問)(不支持lseek函數)

4)讀操作被阻塞:當管道中沒有數據時

寫操作被阻塞:管道被寫滿時(管道大小為64K);5)管道破裂:管道讀端被關閉,再向管道中寫入數據時,

即向管道寫入數據的進程會收到來自內核發送的SIGPIPE信號6)數據存放于內存中,讀取后就不存在了

3)使用步驟:

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

【3】(FIFO)有名管道

1)簡介

在內核開辟一塊空間,用來存儲數據,但是此空間通過存儲在磁盤空間的文件名來操作;

先進先出模式,消息被讀取后則刪除

2)特點

1)可以使互不相關的兩個進程互相通信,有名管道可以通過路徑名來指出,并且在文件系統中可見

2)進程通過文件IO來操作有名管道,內容存放在內存中

3)不支持lseek()操作

4)其它與無名管道一樣。

5)讀操作被阻塞:當管道中沒有數據時

寫操作被阻塞:管道被寫滿時(管道大小為64K);

6)有名管道在被創建后,顯示大小為0(因為其存放在內存中)

7)有名管道文件在被單獨打開時(無論讀/寫)都會阻塞,直到讀端和寫端都被打開時停止阻塞

3)有名管道的阻塞問題

由于普通文件的讀寫時不會出現阻塞問題,而在管道的讀寫中卻有阻塞的可能,這里的非阻塞標志可以在open()函數中設定為O_NONBLOCK。

對于O_RDONLY、 O_WRONLY、 O_NONBLOCK有4種組合方式:

1、open(const char *path,O_RDONLY)

在這種情況下,open 調用將阻塞,除非有一個進程以寫方式打開同一個FIFO,否則它不會返回

2、open(const char *path,O_RDONLY|O_NONBLOCK )

即使沒有其它進程以寫方式打開FIFO,這open調 用也將成功并馬上返回3、open(const char *path,O_WRONLY)

open調用將阻塞,直到有一個進程以讀方式打開同一個 FIFO為止。

4、open(const char *path,O_WRONLY|O_NONBLOCK )

open調用總是立刻返回,便如果沒有進程以讀方式打開FIFO文件, open調用將返回一個錯誤(-1)并且FIFO也不會被打開。

對于讀進程

• 若該管道是阻塞打開,且當前FIFO內沒有數據,則對讀進程而言將一直阻塞到有數據寫入。

• 若該管道是非阻塞打開,則不論FIFO內是否有數據,讀進程都會立即執行讀操作。對于寫進程

• 若該管道是阻塞打開,則寫操作將一直阻塞到數據可以被寫入。

• 若該管道是非阻塞打開而不能寫入全部數據,則讀操作進行部分寫入或者調用失敗。

4)使用步驟:

1)先在某一個進程中使用mkfifo()在內核空間中創建有名管道(在文件系統中

可見)

2)在需要使用有名管道的進程中通過 open()打開文件

3)使用文件IO對有名管道進行訪問

5)相關函數

【4】信號signal

1)簡介

信號是在軟件層次上對中斷機制的一種模擬,是唯一一種異步通信方式

信號可以直接進行用戶空間進程和內核進程之間的交互,內核進程也可以利用它來通知用戶空間進程發生了哪些系統事件

如果進程當前未處于執行態,則該信號就由內核保存起來,直到該進程恢復執行再傳遞給它

linux內核通過信號通知用戶進程,不同的信號類型代表不同的事件

如果一個進程被設置為阻塞,則該信號的傳遞被延遲,直到其阻塞被取消時才被傳遞給進程

用戶進程對信號的響應方式:

忽略信號:對信號不做任何處理,但是有兩個信號不能被忽略:SIGKILL和SIGSTOP捕捉信號:定義函數處理信號,當信號發生時,自行相應的處理函數執行缺省操作:Linux對每種信號都規定了默認操作

kill -l 34(SIGRTMIN)-64(SIGRTMAX) 可靠信號 信號可以被內核保存萬次 而其他信號只會被保存一次,如果程序處于暫停態,且需多次接受相同信號,內核相同的信號只會發送一次給程序。

kill [-signal] pid 默認發送SIGTERM(15)終止進程 -signal指定信號 pid指定發送對

killall [-u user | prog] prog指定進程號 user指定用戶名








上一篇:嵌入式學習筆記:c語言結構體學習方法

下一篇:嵌入式學習筆記:C++繼承的三種方式,用實例教會你

华清图书馆

0元电子书,限时免费申领

10本华清图书PDF版

扫码关注华清远见公众号
自动回复“2”,即可申领!
熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 熟女肥臀白浆大屁股一区二区 | 国产精品 私密保健会所 | 成在线人免费无码高潮喷水 | 国产精品全新69影院在线看 | 亚洲爆乳大丰满无码专区 | 东京热456大交乱高清视频 | 久久国产色AV | 小荡货腿张开给我cao免费视频 | 欧洲LV尺码大 | 无码AV天天AV天天爽 | gogogo免费高清在线中国 | 狠狠色丁香婷婷久久综合不卡 | 狠狠亚洲超碰狼人久久 | 人妻少妇一区二区三区 | 人妻中文字幕无码系列 | 中文日产幕无线码一区 | 男女一级黄色 | 日本一本草久国产欧美日韩 | 日韩人妻无码精品久久 | 亚洲av国产av综合av | 欧美又大又粗AAA片免费看 | 国产精品扒开腿做爽爽爽A片唱戏 | 亚洲AV成人一二三区观看 | 亚洲AV无码专区国产不卡顿 | 最新合集 国产专区 | 亚洲成年看片在线观看 | 国产成人牲交在线观看视频 | 无码毛片一区二区本码视频 | 欧美精品亚洲精品日韩已满十八 | 男女啪啪抽搐呻吟高潮动态图 | 精品人妻无码专区在线无广告视频 | 无码av动漫精品专区 | 在线观看麻豆国产成人AV在线播放 | 国产a自拍 | 亚洲综合色自拍一区 | 别揉我奶头~嗯~啊~视频免费网站 | CAOPORN国产精品免费 | 日本一卡2卡3卡4卡5卡精品视频 | 亚洲精品久久久久中文字幕m男 | 一本久道久久综合狠狠躁AV | 中文字幕一区二区三区在线不卡 |