日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

只需要3分鐘就能讓你快速了解信號驅(qū)動式IO 快來看看吧

GReq_mcu168 ? 來源:嵌入式Hacker ? 作者:吳偉東Jack ? 2021-03-18 11:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、Linux 的 5 種 IO 模型

阻塞式 I/O:

系統(tǒng)調(diào)用可能因?yàn)闊o法立即完成而被操作系統(tǒng)掛起,直到等待的事件發(fā)生為止。

非阻塞式 I/O (O_NONBLOCK):

系統(tǒng)調(diào)用則總是立即返回,而不管事件是否已經(jīng)發(fā)生。

I/O 復(fù)用 (select、poll、epoll):

通過 I/O 復(fù)用函數(shù)向內(nèi)核注冊一組事件,內(nèi)核通過 I/O 復(fù)用函數(shù)把其中就緒的事件通知給應(yīng)用程序。

信號驅(qū)動式 I/O (SIGIO):

為一個目標(biāo)文件描述符指定宿主進(jìn)程,當(dāng)文件描述符上有事件發(fā)生時,SIGIO 的信號處理函數(shù)將被觸發(fā),然后便可對目標(biāo)文件描述符執(zhí)行 I/O 操作。

異步 I/O (POSIX 的 aio_ 系列函數(shù)):

異步 I/O 的讀寫操作總是立即返回,而不論 I/O 是否是阻塞的,真正的讀寫操作由內(nèi)核接管。

思考一下,什么時候應(yīng)該選擇何種 I/O 模型?為何要這么選擇?

下面重點(diǎn)關(guān)注信號驅(qū)動式 I/O 這一模型,其他模型可查閱文末參考書籍。

二、如何使用信號驅(qū)動式 I/O?

一般通過如下 6 個步驟來使用信號驅(qū)動式 I/O 模型。

1> 為通知信號安裝處理函數(shù)。

通過 sigaction() 來完成:

intsigaction(intsignum,conststructsigaction*act,structsigaction*oldact);

默認(rèn)情況下,這個通知信號為 SIGIO。

2> 為文件描述符的設(shè)置屬主。

通過 fcntl() 的 F_SETOWN 操作來完成:

fcntl(fd,F_SETOWN,pid)

屬主是當(dāng)文件描述符上可執(zhí)行 I/O 時,會接收到通知信號的進(jìn)程或進(jìn)程組。

pid 為正整數(shù)時,代表了進(jìn)程 ID 號。

pid 為負(fù)整數(shù)時,它的絕對值就代表了進(jìn)程組 ID 號。

3> 使能非阻塞 I/O。

通過 fcntl() 的 F_SETFL 操作來完成:

flags=fcntl(fd,F_GETFL); fcntl(fd,F_SETFL,flags|O_NONBLOCK);

4> 使能信號驅(qū)動 I/O。

通過 fcntl() 的 F_SETFL 操作來完成:

flags=fcntl(fd,F_GETFL); fcntl(fd,F_SETFL,flags|O_ASYNC);

5> 進(jìn)程等待 "IO 就緒" 信號的到來。

當(dāng) I/O 操作就緒時,內(nèi)核會給進(jìn)程發(fā)送一個信號,然后調(diào)用在第 1 步中安裝好的信號處理函數(shù)。

6> 進(jìn)程盡可能多地執(zhí)行 I/O 操作。

循環(huán)執(zhí)行 I/O 系統(tǒng)調(diào)用直到失敗為止,此時錯誤碼為 EAGAIN 或 EWOULDBLOCK。

原因:

信號驅(qū)動 I/O 提供的是邊緣觸發(fā)通知,即只有當(dāng) I/O 事件發(fā)生時我們才會收到通知,

且當(dāng)文件描述符收到 I/O 事件通知時,并不知道要處理多少 I/O 數(shù)據(jù)。

三、內(nèi)核何時會發(fā)送 "IO 就緒" 信號?

對于不同類型的文件描述符,情況不一樣。

1> 終端

對于終端,當(dāng)有新的輸入時會會產(chǎn)生信號。

2> 管道和 FIFO

對于讀端,下列情況會產(chǎn)生信號:

數(shù)據(jù)寫入到管道中;

管道的寫端關(guān)閉;

對于寫端,下列情況會產(chǎn)生信號:

對管道的讀操作增加了管道中的空余空間大小。

管道的讀端關(guān)閉;

3> 套接字

對于 UDP 套接字,下列情況會產(chǎn)生信號:

數(shù)據(jù)報(bào)到達(dá)套接字;

套接字上發(fā)生異步錯誤;

對于 TCP 套接字,信號驅(qū)動式 I/O 近乎無用。

太多情況都會產(chǎn)生信號,而我們又無法得知事件類型,因此這里就不再列舉其產(chǎn)生信號的情況。

四、最簡單的示例

信號處理函數(shù):

staticvolatilesig_atomic_tgotSigio=0; staticvoidhandler(intsig) { gotSigio=1; }

主程序:

intmain(intargc,char*argv[]) { intflags,j,cnt; structtermiosorigTermios; charch; structsigactionsa; intdone; /*Establishhandler*/ sigemptyset(&sa.sa_mask); sa.sa_flags=SA_RESTART; sa.sa_handler=handler; if(sigaction(SIGIO,&sa,NULL)==-1){ perror("sigaction() "); exit(1); } /*Setownerprocess*/ if(fcntl(STDIN_FILENO,F_SETOWN,getpid())==-1){ perror("fcntl()/F_SETOWN "); exit(1); } /*Enable"I/Opossible"signalingandmakeI/Ononblocking*/ flags=fcntl(STDIN_FILENO,F_GETFL); if(fcntl(STDIN_FILENO,F_SETFL,flags|O_ASYNC|O_NONBLOCK)==-1){ perror("fcntl()/F_SETFL "); exit(1); } for(done=0,cnt=0;!done;cnt++){ sleep(1); if(gotSigio){ gotSigio=0; /*Readallavailableinputuntilerror(probablyEAGAIN) orEOF*/ while(read(STDIN_FILENO,&ch,1)>0&&!done){ printf("cnt=%d;read%c ",cnt,ch); done=ch=='#'; } } } exit(0); }

運(yùn)行效果:

./build/sigio a cnt=0;reada cnt=0;read abc cnt=4;reada cnt=4;readb cnt=4;readc cnt=4;read # cnt=7;read#

該程序會先使能信號驅(qū)動 IO,然后循環(huán)執(zhí)行計(jì)數(shù)操作。

當(dāng)有 IO 就緒信號到來時,會去終端讀取數(shù)據(jù)并打印出來,然后繼續(xù)執(zhí)行計(jì)數(shù)操作。

五、擴(kuò)展知識

I/O 多路復(fù)用 、信號驅(qū)動 I/O 以及 epoll 機(jī)制可用于監(jiān)視多個文件描述符。

它們并不實(shí)際執(zhí)行 I/O 操作,當(dāng)某個文件描述符處于就緒態(tài),仍需采用傳統(tǒng)的 I/O 系統(tǒng)調(diào)用來完成 I/O 操作。

相比 I/O 多路復(fù)用,當(dāng)監(jiān)視大量的文件描述符時信號驅(qū)動 I/O 有著顯著的性能優(yōu)勢,原因是內(nèi)核能夠幫進(jìn)程記錄了正在監(jiān)視的文件描述符列表。

信號驅(qū)動 I/O 的缺點(diǎn):

信號的處理流程較為復(fù)雜;

無法指定需要監(jiān)控的事件類型。

Linux 特有的 epoll 是一個更好的選擇。

六、相關(guān)參考

UNIX 網(wǎng)絡(luò)編程卷1

6.2 I/O模型

25 信號驅(qū)動式I/O

Linux-UNIX 系統(tǒng)編程手冊

63 其他備選的I/O模型

Linux 高性能服務(wù)器編程

8.3 I/O 模型

Linux 多線程服務(wù)端編程_使用muduo C++網(wǎng)絡(luò)庫

7.4.1 muduo的IO模型

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1998

    瀏覽量

    88755

原文標(biāo)題:3 分鐘快速了解信號驅(qū)動式 IO

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    6分鐘充滿,超越二代刀片!寧德時代新一代電池技術(shù)亮相

    了第三代神行超充電池,從10%到98%只需要627秒,從10%到80%僅需要驚人的344秒!等效10C,峰值15C的充電功率,充電跟加油
    的頭像 發(fā)表于 04-24 09:53 ?7231次閱讀
    6<b class='flag-5'>分鐘</b>充滿,超越二代刀片!寧德時代新一代電池技術(shù)亮相

    從4小時到15分鐘:充電網(wǎng)絡(luò)運(yùn)維如何告別“甩鍋”與“跑斷腿”?

    團(tuán)隊(duì)說“報(bào)文正常,是平臺超時”,網(wǎng)絡(luò)團(tuán)隊(duì)說“鏈路通了,不是我的問題”。最終花了4個小時,才發(fā)現(xiàn)是證書過期導(dǎo)致握手失敗——而更換證書只需要2分鐘。這就是典型的“甩鍋游
    的頭像 發(fā)表于 04-14 12:13 ?901次閱讀
    從4小時到15<b class='flag-5'>分鐘</b>:充電網(wǎng)絡(luò)運(yùn)維如何告別“甩鍋”與“跑斷腿”?

    容輝物聯(lián)天啟 TQN2 開發(fā)板|無網(wǎng)通信快速上手指南

    產(chǎn)品支持三種運(yùn)行模式,無需安裝驅(qū)動,只需要考慮數(shù)據(jù)格式: AT指令模式 透傳模式:輸入什么數(shù)據(jù)就發(fā)送什么數(shù)據(jù)(比如輸入123,就發(fā)送123) 定時上報(bào)模式:每隔若干分鐘,產(chǎn)品把經(jīng)緯度發(fā)送出去 舉個
    發(fā)表于 03-25 15:33

    分鐘了解遠(yuǎn)程io的原理# 三格電子# 遠(yuǎn)程io

    通信遠(yuǎn)程io
    jf_68793483
    發(fā)布于 :2026年02月02日 13:59:43

    嵌入驅(qū)動開發(fā),需要掌握哪些技能?

    有經(jīng)驗(yàn)的老司機(jī)都知道,做嵌入驅(qū)動開發(fā)需要掌握一系列的技能,包含編程、硬件、操作系統(tǒng)、調(diào)試等多個方面。 1、硬件知識熟悉原理圖:能看懂原理圖以及各種元器件的含義,以及PCB布局等。
    發(fā)表于 01-20 16:46

    基于ESI文件的EtherCAT從機(jī)快速適配實(shí)戰(zhàn)|活動預(yù)告

    在工業(yè)設(shè)備開發(fā)中,是否常面臨這樣的困境:產(chǎn)線上新增了一個不同品牌的伺服驅(qū)動器,或需要集成一款新型IO模塊,面對數(shù)據(jù)手冊卻不知如何下手,廠家提供了ESI文件,卻不知道如何使用……如果有
    的頭像 發(fā)表于 12-23 18:12 ?612次閱讀
    基于ESI文件的EtherCAT從機(jī)<b class='flag-5'>快速</b>適配實(shí)戰(zhàn)|活動預(yù)告

    網(wǎng)絡(luò)接口:數(shù)字世界的“門鈴”,了解多少?

    ,還能為選擇適合的網(wǎng)絡(luò)解決方案奠定基礎(chǔ)。在萬物互聯(lián)的時代,這些基礎(chǔ)知識顯得愈發(fā)重要。 希望這篇簡單的介紹能幫助大家對網(wǎng)絡(luò)接口有基本的了解。我始終相信,了解技術(shù)細(xì)節(jié)能讓客戶做出更明智的選擇。如果
    發(fā)表于 11-26 18:53

    極簡XXTEA加密解密:5分鐘代碼速學(xué)!

    XXTEA加密解密的極簡實(shí)現(xiàn)方法來了!只需5分鐘,跟著本文的代碼示例學(xué)習(xí),就能快速掌握加密與解密的核心技巧,輕松應(yīng)用到項(xiàng)目中。 XXTEA
    的頭像 發(fā)表于 11-12 14:49 ?511次閱讀
    極簡XXTEA加密解密:5<b class='flag-5'>分鐘</b>代碼速學(xué)!

    如果想運(yùn)用蜂鳥E203給的一個AXI接口,只需要自己寫一個AXI協(xié)議的從機(jī)就行嗎,蜂鳥的cpu核需要改動什么嗎?

    請問大佬們,如果想運(yùn)用蜂鳥E203給的一個AXI接口,只需要自己寫一個AXI協(xié)議的從機(jī)就行嗎,蜂鳥的cpu核需要改動什么嗎?
    發(fā)表于 11-11 06:13

    UPS選型指南:小白必看!3分鐘搞懂在線、后備、互動的區(qū)別

    (不間斷電源)就是專門解決這個問題的"電力保鏢"。但市面上有在線、后備、互動三種UPS,到底該怎么選?今天用大白話+生活類比,3分鐘
    的頭像 發(fā)表于 10-09 08:51 ?1659次閱讀
    UPS選型指南:小白必看!<b class='flag-5'>3</b><b class='flag-5'>分鐘</b>搞懂在線<b class='flag-5'>式</b>、后備<b class='flag-5'>式</b>、互動<b class='flag-5'>式</b>的區(qū)別

    測試小白3分鐘上手,零代碼自動化測試平臺,15分鐘搭建自動化測試方案

    還在為不懂代碼、搭建測試方案耗時久而發(fā)愁?ATECLOUD 零代碼自動化測試平臺,專為自動化測試量身打造,小白3 分鐘就能輕松上手,15 分鐘即可完成自動化測試方案搭建,徹底打破傳統(tǒng)測
    的頭像 發(fā)表于 09-22 17:52 ?1076次閱讀
    測試小白<b class='flag-5'>3</b><b class='flag-5'>分鐘</b>上手,零代碼自動化測試平臺,15<b class='flag-5'>分鐘</b>搭建自動化測試方案

    低頻變壓器廠家,有哪些是符合設(shè)備的變壓器!來看看吧

    ?一、按核心應(yīng)用分類 呂:生:150-1909-3116 工頻電力變壓器 工作頻率: 50Hz/60Hz 典型類型: 配電變壓器: 10kV/0.4kV,為樓宇、工廠供電(如油浸、干式變壓器
    的頭像 發(fā)表于 07-23 08:47 ?1109次閱讀
    低頻變壓器廠家,有哪些是符合<b class='flag-5'>你</b>設(shè)備的變壓器!<b class='flag-5'>來看看吧</b>

    【選型】常見的遙控開關(guān)控制協(xié)議,看看哪種適合

    遙控開關(guān),是一種通過無線信號非接觸遠(yuǎn)程控制電路通斷的裝置,今天我們一起聊一聊常見的無線信號類別,看看哪種更適合?1.紅外遙控紅外型遙控,
    的頭像 發(fā)表于 07-17 19:34 ?2050次閱讀
    【選型】常見的遙控開關(guān)控制協(xié)議,<b class='flag-5'>看看</b>哪種適合<b class='flag-5'>你</b>?

    ADI Trinamic TMC5240評估套件數(shù)據(jù)手冊

    。它的啟動快速、簡單,只需分鐘,就能讓用戶的電機(jī)運(yùn)轉(zhuǎn),同時提供對所有寄存器、功能和診斷的完全訪問。對于診斷,MCU和TMC5240之間的所有信號
    的頭像 發(fā)表于 06-17 14:12 ?1525次閱讀
    ADI Trinamic TMC5240評估套件數(shù)據(jù)手冊

    設(shè)計(jì)雙極性輸入、全差輸出ADC驅(qū)動器時需要考慮什么

    軌。為了解決這個問題,我們將介紹需要采取哪些步驟來設(shè)計(jì)雙極性輸入、全差輸出ADC 驅(qū)動器,同時確保達(dá)到所需的噪聲和失真性能。
    的頭像 發(fā)表于 06-14 13:55 ?1628次閱讀
    設(shè)計(jì)雙極性輸入、全差<b class='flag-5'>分</b>輸出ADC<b class='flag-5'>驅(qū)動</b>器時<b class='flag-5'>需要</b>考慮什么
    个旧市| 鞍山市| 古交市| 晋宁县| 罗山县| 汉寿县| 西乡县| 泾源县| 吴川市| 桦川县| 高邑县| 紫金县| 凤阳县| 仁布县| 东乡县| 台安县| 慈利县| 内江市| 元谋县| 合作市| 徐汇区| 永丰县| 伊川县| 图木舒克市| 梧州市| 南木林县| 乌鲁木齐市| 大庆市| 灵宝市| 会泽县| 都昌县| 宜宾市| 七台河市| 平定县| 烟台市| 江门市| 班戈县| 河东区| 肃北| 个旧市| 桐柏县|