91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

只需要3分鐘就能讓你快速了解信號(hào)驅(qū)動(dòng)式IO 快來(lái)看看吧

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

掃碼添加小助手

加入工程師交流群

一、Linux 的 5 種 IO 模型

阻塞式 I/O:

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

非阻塞式 I/O (O_NONBLOCK):

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

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

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

信號(hào)驅(qū)動(dòng)式 I/O (SIGIO):

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

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

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

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

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

二、如何使用信號(hào)驅(qū)動(dòng)式 I/O?

一般通過(guò)如下 6 個(gè)步驟來(lái)使用信號(hào)驅(qū)動(dòng)式 I/O 模型。

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

通過(guò) sigaction() 來(lái)完成:

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

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

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

通過(guò) fcntl() 的 F_SETOWN 操作來(lái)完成:

fcntl(fd,F_SETOWN,pid)

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

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

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

3> 使能非阻塞 I/O。

通過(guò) fcntl() 的 F_SETFL 操作來(lái)完成:

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

4> 使能信號(hào)驅(qū)動(dòng) I/O。

通過(guò) fcntl() 的 F_SETFL 操作來(lái)完成:

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

5> 進(jìn)程等待 "IO 就緒" 信號(hào)的到來(lái)。

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

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

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

原因:

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

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

三、內(nèi)核何時(shí)會(huì)發(fā)送 "IO 就緒" 信號(hào)?

對(duì)于不同類(lèi)型的文件描述符,情況不一樣。

1> 終端

對(duì)于終端,當(dāng)有新的輸入時(shí)會(huì)會(huì)產(chǎn)生信號(hào)。

2> 管道和 FIFO

對(duì)于讀端,下列情況會(huì)產(chǎn)生信號(hào):

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

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

對(duì)于寫(xiě)端,下列情況會(huì)產(chǎn)生信號(hào):

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

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

3> 套接字

對(duì)于 UDP 套接字,下列情況會(huì)產(chǎn)生信號(hào):

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

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

對(duì)于 TCP 套接字,信號(hào)驅(qū)動(dòng)式 I/O 近乎無(wú)用。

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

四、最簡(jiǎn)單的示例

信號(hào)處理函數(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#

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

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

五、擴(kuò)展知識(shí)

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

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

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

信號(hào)驅(qū)動(dòng) I/O 的缺點(diǎn):

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

無(wú)法指定需要監(jiān)控的事件類(lèi)型。

Linux 特有的 epoll 是一個(gè)更好的選擇。

六、相關(guān)參考

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

6.2 I/O模型

25 信號(hào)驅(qū)動(dòng)式I/O

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

63 其他備選的I/O模型

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

8.3 I/O 模型

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

7.4.1 muduo的IO模型

編輯:jq

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

    關(guān)注

    12

    文章

    1969

    瀏覽量

    88622

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

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

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

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

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

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

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

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

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

    測(cè)試小白3分鐘上手,零代碼自動(dòng)化測(cè)試平臺(tái),15分鐘搭建自動(dòng)化測(cè)試方案

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

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

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

    ADI Trinamic TMC5240評(píng)估套件數(shù)據(jù)手冊(cè)

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

    仿真又不對(duì)?看看一流工程師怎么分析!

    可能有人覺(jué)得大信號(hào)信號(hào)要看仿真設(shè)置,激勵(lì)源幅度大就是大信號(hào),激勵(lì)源幅度小就是小信號(hào)。正不正確只需要簡(jiǎn)單驗(yàn)證一下就好,還是上面的電路,對(duì)激勵(lì)
    的頭像 發(fā)表于 05-06 16:56 ?2084次閱讀
    仿真又不對(duì)?<b class='flag-5'>看看</b>一流工程師怎么分析!

    快速上手!WiFiScan入門(mén)指南,開(kāi)啟的“賽博羅盤(pán)”

    無(wú)論是排查網(wǎng)絡(luò)故障、優(yōu)化信號(hào)覆蓋,還是探索未知的無(wú)線世界,它都像一把“賽博羅盤(pán)”,為揭開(kāi)數(shù)字空間的信號(hào)奧秘。只需簡(jiǎn)單幾步,
    的頭像 發(fā)表于 04-25 16:06 ?1393次閱讀
    <b class='flag-5'>快速</b>上手!WiFiScan入門(mén)指南,開(kāi)啟<b class='flag-5'>你</b>的“賽博羅盤(pán)”

    振弦應(yīng)變計(jì):電焊VS埋入3分鐘看懂核心差異

    應(yīng)變計(jì)需要預(yù)埋到結(jié)構(gòu)內(nèi)部,施工復(fù)雜是否值得?兩種類(lèi)型的成本、精度、耐久性有何差異?南京峟思將為大家解析兩類(lèi)振弦應(yīng)變計(jì)的核心區(qū)別,并給出選型決策框架,助您快速匹配項(xiàng)目需
    的頭像 發(fā)表于 04-17 14:50 ?996次閱讀
    振弦應(yīng)變計(jì):電焊<b class='flag-5'>式</b>VS埋入<b class='flag-5'>式</b>,<b class='flag-5'>3</b><b class='flag-5'>分鐘</b>看懂核心差異

    10分鐘上手寫(xiě)代碼,LuatOS協(xié)程輕松掌握!

    10分鐘學(xué)會(huì)LuatOS協(xié)程,從此的程序也能像通勤族利用碎片時(shí)間一樣游刃有余。現(xiàn)在就去動(dòng)手試一試,開(kāi)啟異步編程新體驗(yàn)! 寫(xiě)給第一次聽(tīng)說(shuō)協(xié)程的?: 別怕!協(xié)程不是復(fù)雜概念,看完這篇,10分鐘
    的頭像 發(fā)表于 04-10 15:18 ?704次閱讀
    10<b class='flag-5'>分鐘</b>上手寫(xiě)代碼,LuatOS協(xié)程輕松掌握!

    不知道的COB封裝測(cè)試方法,快來(lái)看看推拉力測(cè)試機(jī)的應(yīng)用!

    近期,有客戶(hù)向小編咨詢(xún)推拉力測(cè)試機(jī),如何進(jìn)行COB封裝測(cè)試?在現(xiàn)代電子制造領(lǐng)域,COB(Chip on Board)封裝技術(shù)因其高集成度和靈活性被廣泛應(yīng)用于LED、傳感器、顯示驅(qū)動(dòng)等產(chǎn)品中。然而
    的頭像 發(fā)表于 04-03 10:42 ?1626次閱讀
    <b class='flag-5'>你</b>不知道的COB封裝測(cè)試方法,<b class='flag-5'>快來(lái)看看</b>推拉力測(cè)試機(jī)的應(yīng)用!

    騰訊會(huì)議免費(fèi)40分鐘不夠用?要的秘訣在這里!

    隨著遠(yuǎn)程工作的普及,視頻會(huì)議工具成為許多企業(yè)和個(gè)人的必備選擇。然而,像騰訊會(huì)議這樣的免費(fèi)版工具,其40分鐘的時(shí)長(zhǎng)限制常常讓人頭疼——尤其是在需要長(zhǎng)時(shí)間討論、培訓(xùn)或協(xié)作時(shí),中途斷線不僅打斷思路,還
    的頭像 發(fā)表于 03-25 09:24 ?2248次閱讀
    騰訊會(huì)議免費(fèi)40<b class='flag-5'>分鐘</b>不夠用?<b class='flag-5'>你</b>要的秘訣在這里!