女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

一、Linux 的 5 種 IO 模型

阻塞式 I/O:

系統調用可能因為無法立即完成而被操作系統掛起,直到等待的事件發生為止。

非阻塞式 I/O (O_NONBLOCK):

系統調用則總是立即返回,而不管事件是否已經發生。

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

通過 I/O 復用函數向內核注冊一組事件,內核通過 I/O 復用函數把其中就緒的事件通知給應用程序。

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

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

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

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

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

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

二、如何使用信號驅動式 I/O?

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

1> 為通知信號安裝處理函數。

通過 sigaction() 來完成:

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

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

2> 為文件描述符的設置屬主。

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

fcntl(fd,F_SETOWN,pid)

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

pid 為正整數時,代表了進程 ID 號。

pid 為負整數時,它的絕對值就代表了進程組 ID 號。

3> 使能非阻塞 I/O。

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

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

4> 使能信號驅動 I/O。

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

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

5> 進程等待 "IO 就緒" 信號的到來。

當 I/O 操作就緒時,內核會給進程發送一個信號,然后調用在第 1 步中安裝好的信號處理函數。

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

循環執行 I/O 系統調用直到失敗為止,此時錯誤碼為 EAGAIN 或 EWOULDBLOCK。

原因:

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

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

三、內核何時會發送 "IO 就緒" 信號?

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

1> 終端

對于終端,當有新的輸入時會會產生信號。

2> 管道和 FIFO

對于讀端,下列情況會產生信號:

數據寫入到管道中;

管道的寫端關閉;

對于寫端,下列情況會產生信號:

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

管道的讀端關閉;

3> 套接字

對于 UDP 套接字,下列情況會產生信號:

數據報到達套接字;

套接字上發生異步錯誤;

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

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

四、最簡單的示例

信號處理函數:

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#

該程序會先使能信號驅動 IO,然后循環執行計數操作。

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

五、擴展知識

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

它們并不實際執行 I/O 操作,當某個文件描述符處于就緒態,仍需采用傳統的 I/O 系統調用來完成 I/O 操作。

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

信號驅動 I/O 的缺點:

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

無法指定需要監控的事件類型。

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

六、相關參考

UNIX 網絡編程卷1

6.2 I/O模型

25 信號驅動式I/O

Linux-UNIX 系統編程手冊

63 其他備選的I/O模型

Linux 高性能服務器編程

8.3 I/O 模型

Linux 多線程服務端編程_使用muduo C++網絡庫

7.4.1 muduo的IO模型

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 驅動
    +關注

    關注

    12

    文章

    1918

    瀏覽量

    86944

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    ADI Trinamic TMC5240評估套件數據手冊

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

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

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

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

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

    騰訊會議免費40分鐘不夠用?要的秘訣在這里!

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

    STM32CubeMx使用ADC時,只需要將通道進行配置,不需要對引腳進行模擬輸入嗎?

    當使用ADC時,只需要將通道進行配置,不需要對引腳進行模擬輸入嗎?模擬輸入腳只能夠接收模擬電壓信號,而ADC只是將模擬信號轉換為數字信號的,
    發表于 03-13 07:32

    MR30分布式IO模塊:驅動智能制造工廠的工業互聯與高效控制新范式

    在工業4.0與智能制造浪潮的推動下,傳統制造業正經歷著從“機械驅動”向“數據驅動”的深刻轉型。作為工業數據連接領域的領軍者,明達技術憑借其自主研發的MR30分布式IO模塊,以創新的技術
    的頭像 發表于 02-08 16:01 ?401次閱讀

    為什么嵌入驅動開發工程師可以拿高薪?

    技術領域具有不可替代的地位。 成為一名優秀的嵌入驅動工程師只需要深耕以下幾點: 1)堅實的技術基礎: 首先,需要有堅實的基礎,包括計算機組成原理、微處理器與微控制器架構以及電路設計
    發表于 01-07 16:56

    MR30分布式IO模塊助力PLC,打造高效智能倉儲系統

    詳細介紹如何通過明達技術MR30分布式IO模塊配合西門子PLC,實現智能倉儲系統中的各種信號采集與控制。
    的頭像 發表于 01-03 10:16 ?493次閱讀
    MR30<b class='flag-5'>分布式</b><b class='flag-5'>IO</b>模塊助力PLC,打造高效智能倉儲系統

    ADS1115接線是只需要接SCL與SDA嗎?ADDR與ALERT/RDY需要接線嗎?

    ADS1115接線是只需要接SCL與SDA嗎?ADDR與ALERT/RDY需要接線嗎? 差輸入與單輸入有什么區別,怎樣配置兩種模式?
    發表于 12-31 06:27

    AD模數轉換器敷銅是AGND和DGND分開敷,還是只需要在頂層和底層敷AGND?

    AD模數轉換器敷銅,雙面布板,AGND和DGND已通過0歐姆電阻連接好,我想問,敷銅是AGND和DGND分開敷,還是只需要在頂層和底層敷AGND?
    發表于 12-27 08:16

    ADS1246校正是不是只需要發送校正命令就行了?

    第一次作信號測量工作,好多基礎的知識不甚了解 ADS1246校正是不是只需要發送校正命令就行了,后面測量模擬信號轉換出來的二進制數直接使用就行了嗎?這些數據不
    發表于 12-27 06:19

    雙通道AD只需要用一路,另一通道不需要時模擬輸入引腳如何處理?

    雙通道AD只需要用一路,另一通道不需要時模擬輸入引腳如何處理?是可以直接懸空,電阻或電容接地?看手冊好像沒有提到相關方面的處理辦法。或者有沒有相關參考原理圖
    發表于 12-13 13:30

    請問HD3SS215 aux_sel需要如何做設定?是只需要將電壓設定為1/2即可使用嗎?

    請問HD3SS215 aux_sel需要如何做設定? 是只需要將電壓設定為1/2即可使用嗎? 例如3.3V 的1/2電位?
    發表于 12-09 07:27

    想如何運放設計一個完全差輸出的電路?

    我想用運放設計一個完全差輸出的電路。 信號頻率范圍:1-5K 輸出信號幅度:+ - 10V. 這個信號輸出差分器。我有時只需要輸了半個正
    發表于 08-29 06:47

    增量編碼器3大特點,工作模式,精度,輸出脈沖信號 一起了解一下嗎

    增量編碼器3大特點,工作模式,精度,輸出脈沖信號...一起了解一下嗎?在現代工業自動化和控制系統中,增量編碼器扮演著至關重要的角色。它可
    的頭像 發表于 08-15 14:20 ?1335次閱讀
    增量<b class='flag-5'>式</b>編碼器<b class='flag-5'>3</b>大特點,工作模式,精度,輸出脈沖<b class='flag-5'>信號</b> 一起<b class='flag-5'>了解</b>一下嗎