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

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

完善資料讓更多小伙伴認識你,還能領(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)用可能因為無法立即完成而被操作系統(tǒng)掛起,直到等待的事件發(fā)生為止。

非阻塞式 I/O (O_NONBLOCK):

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

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

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

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

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

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

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

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

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

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

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

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

通過 sigaction() 來完成:

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

默認情況下,這個通知信號為 SIGIO。

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

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

fcntl(fd,F_SETOWN,pid)

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

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

pid 為負整數(shù)時,它的絕對值就代表了進程組 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> 進程等待 "IO 就緒" 信號的到來。

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

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

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

原因:

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

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

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

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

1> 終端

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

2> 管道和 FIFO

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

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

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

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

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

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

3> 套接字

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

數(shù)據(jù)報到達套接字;

套接字上發(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); }

運行效果:

./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í)行計數(shù)操作。

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

五、擴展知識

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

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

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

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

信號的處理流程較為復雜;

無法指定需要監(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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1976

    瀏覽量

    88625

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    分鐘了解遠程io的原理# 三格電子# 遠程io

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

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

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

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

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

    極簡XXTEA加密解密:5分鐘代碼速學!

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

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

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

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

    (不間斷電源)就是專門解決這個問題的"電力保鏢"。但市面上有在線、后備、互動三種UPS,到底該怎么選?今天用大白話+生活類比,3分鐘
    的頭像 發(fā)表于 10-09 08:51 ?1379次閱讀
    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 ?909次閱讀
    測試小白<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 ?913次閱讀
    低頻變壓器廠家,有哪些是符合<b class='flag-5'>你</b>設(shè)備的變壓器!<b class='flag-5'>來看看吧</b>

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

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

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

    軌。為了解決這個問題,我們將介紹需要采取哪些步驟來設(shè)計雙極性輸入、全差輸出ADC 驅(qū)動器,同時確保達到所需的噪聲和失真性能。
    的頭像 發(fā)表于 06-14 13:55 ?1260次閱讀
    設(shè)計雙極性輸入、全差<b class='flag-5'>分</b>輸出ADC<b class='flag-5'>驅(qū)動</b>器時<b class='flag-5'>需要</b>考慮什么

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

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

    快速上手!WiFiScan入門指南,開啟的“賽博羅盤”

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

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

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

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

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

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

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