国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Linux-C 編程 | 3 分鐘快速了解信號驅動式 IO

系統
系統調用可能因為無法立即完成而被操作系統掛起,直到等待的事件發生為止。系統調用則總是立即返回,而不管事件是否已經發生。

[[384784]]

本文轉載自微信公眾號「嵌入式Hacker」,作者嵌入式Hacker。轉載本文請聯系嵌入式Hacker公眾號。

一、Linux 的 5 種 IO 模型

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

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

四、最簡單的示例

五、擴展知識

一、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() 來完成:

  1. int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 

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

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

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

  1. fcntl(fd, F_SETOWN, pid) 

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

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

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

3> 使能非阻塞 I/O。

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

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

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

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

  1. flags = fcntl(fd, F_GETFL); 
  2. 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 近乎無用。

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

四、最簡單的示例

信號處理函數:

  1. static volatile sig_atomic_t gotSigio = 0; 
  2.  
  3. static void handler(int sig) 
  4.     gotSigio = 1; 

主程序:

  1. int main(int argc, char *argv[]) 
  2.     int flags, j, cnt; 
  3.     struct termios origTermios; 
  4.     char ch; 
  5.     struct sigaction sa; 
  6.     int done; 
  7.  
  8.     /* Establish handler */ 
  9.     sigemptyset(&sa.sa_mask); 
  10.     sa.sa_flags = SA_RESTART; 
  11.     sa.sa_handler = handler; 
  12.     if (sigaction(SIGIO, &sa, NULL) == -1) { 
  13.         perror("sigaction()\n"); 
  14.         exit(1); 
  15.     } 
  16.  
  17.     /* Set owner process */ 
  18.     if (fcntl(STDIN_FILENO, F_SETOWN, getpid()) == -1) { 
  19.         perror("fcntl() / F_SETOWN\n"); 
  20.         exit(1); 
  21.     } 
  22.  
  23.     /* Enable "I/O possible" signaling and make I/O nonblocking */ 
  24.     flags = fcntl(STDIN_FILENO, F_GETFL); 
  25.     if (fcntl(STDIN_FILENO, F_SETFL, flags | O_ASYNC | O_NONBLOCK) == -1) { 
  26.         perror("fcntl() / F_SETFL\n"); 
  27.         exit(1); 
  28.     } 
  29.  
  30.     for (done = 0, cnt = 0; !done ; cnt++) { 
  31.         sleep(1); 
  32.  
  33.         if (gotSigio) { 
  34.             gotSigio = 0; 
  35.  
  36.             /* Read all available input until error (probably EAGAIN) 
  37.                or EOF */ 
  38.             while (read(STDIN_FILENO, &ch, 1) > 0 && !done) { 
  39.                 printf("cnt=%d; read %c\n", cnt, ch); 
  40.                 done = ch == '#'
  41.             } 
  42.         } 
  43.     } 
  44.     exit(0); 

運行效果:

  1. ./build/sigio  
  2. cnt=0; read a 
  3. cnt=0; read  
  4.  
  5. abc 
  6. cnt=4; read a 
  7. cnt=4; read b 
  8. cnt=4; read c 
  9. cnt=4; read  
  10.  
  11. 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模型

 

責任編輯:武曉燕 來源: 嵌入式Hacker
相關推薦

2021-03-31 09:10:25

UI設計經驗

2016-12-30 13:43:35

異步編程RxJava

2016-08-11 10:34:37

Javascript函數編程

2016-08-11 10:11:07

JavaScript函數編程

2009-11-12 10:05:09

Visual C++

2023-11-28 09:17:05

Linux編程

2018-05-06 16:26:03

關聯規則數據分析關聯規則推薦

2020-10-18 07:13:44

Linux系統編程信號捕捉

2024-01-09 18:09:43

模型方式DMA

2020-07-17 07:44:25

云計算邊緣計算IT

2021-01-27 18:15:01

Docker底層宿主機

2020-03-23 15:18:26

知識圖譜Web

2018-07-02 15:18:39

Linux文件系統

2017-10-26 08:53:38

前端JavaScript函數式編程

2022-09-08 11:12:09

ES6JavaScript

2024-11-07 16:09:53

2020-09-25 07:34:40

Linux系統編程信號量

2021-01-06 05:23:15

ServiceMesh網絡阿帕網

2017-03-01 13:06:39

Linux驅動技術DMA編程

2023-02-13 09:01:29

Linux驅動實例
點贊
收藏

51CTO技術棧公眾號

欧美挤奶吃奶水xxxxx| 青草视频在线观看视频| 精灵使的剑舞无删减版在线观看| 久久亚洲影视婷婷| 成人国产精品一区二区| 99re热精品视频| 亚洲毛片在线免费观看| 波多野结衣中文在线| 日韩av最新在线| 在线播放高清视频www| 一区二区在线视频播放| 日色在线视频| 中文字幕在线观看不卡| 又黄又爽又色视频| 亚洲手机成人高清视频| 国产在线视频你懂| 岛国片av在线| 国产毛片一区| 亚洲电影一二三区| 影音先锋日韩精品| 黄瓜视频免费观看在线观看www| 国产福利一区二区三区视频在线 | 给我免费播放日韩视频| 国产成+人+综合+亚洲欧洲 | 国产www精品| 蜜桃av综合| 日韩精品专区在线| 婷婷久久综合九色综合99蜜桃| 日本高清不卡在线| 日韩午夜高潮| 欧美日韩在线不卡视频| 精品久久久久久久大神国产| 日韩精品小视频| 美女在线视频一区| 伊人久久大香线蕉综合75| 国产亚洲一区二区三区四区 | 日韩欧美国产wwwww| 成人精品国产亚洲| 国产欧美日韩中文字幕在线| 久久aⅴ国产欧美74aaa| 久久综合色播| 亚洲视频axxx| 综合久久久久| 中文字幕第80页| 91精品蜜臀在线一区尤物| 在线精品国产亚洲| 午夜精品短视频| 午夜私人影院久久久久| 成人全视频在线观看在线播放高清 | 欧美国产中文高清| 日本不卡高清视频一区| 亚洲一二三四久久| 日本一区二区三区中文字幕| 久99久在线| 亚洲一区二区三区四区五区黄| 精品网站在线| 欧美日韩亚洲一区二区三区在线观看| 综合av第一页| 欧美爱爱视频| 亚洲自拍的二区三区| 欧美视频精品在线| 第一会所sis001亚洲| 欧美 国产 日本| 精品伊人久久97| 国产一区二区三区久久久久久久久| 波多野吉衣av| 色偷偷av一区二区三区乱| 视频一区中文字幕| 玖玖综合伊人| 国产精品草莓在线免费观看| 久久婷婷色综合| 欧美成人福利| 日本一级黄视频| 欧美精品一区二区三| 日韩一级在线| 久久久久久久影视| 国产精品免费在线免费 | а√中文在线8| 97碰碰视频| 午夜精品在线看| 亚洲人成亚洲精品| 男人的天堂日韩| 中文字幕视频一区二区在线有码| 日韩精品乱码免费| yellow91字幕网在线| 高清国产在线一区| 精品日本美女福利在线观看| 你懂的一区二区三区| 国产精品无码一本二本三本色| 一区二区在线视频| 国产传媒一区在线| 天堂电影一区| www.日本在线视频| 中文字幕在线亚洲| 91麻豆6部合集magnet| 久久婷婷五月综合色丁香| 日本国产在线播放| 色综合久综合久久综合久鬼88| 国产三级久久久| 日韩激情网站| 182午夜在线观看| 奇米四色中文综合久久| 亚洲精品欧美专区| 精品黄色一级片| 青青草视频免费在线观看| 92看片淫黄大片看国产片| 欧洲亚洲国产日韩| 久久婷婷影院| 偷拍视频一区二区三区| 精品少妇人欧美激情在线观看| 麻豆国产精品va在线观看不卡 | av中文字幕一区二区三区| 久久精品国产精品国产精品污 | 欧美激情视频网址| 国产精品国产三级国产普通话三级| 粉嫩精品导航导航| 99精产国品一二三产品香蕉| 国产精品永久免费视频| 欧美日韩在线电影| 麻豆视频观看网址久久| 日日夜夜综合| 色综合色综合色综合色综合| 日产精品久久久一区二区福利| 欧美高清在线一区| 欧美理论视频| 久草中文在线| 日韩成人手机在线| 韩国精品久久久999| 亚洲高清在线视频| 国产精品xvideos88| 亚洲国产精品精华素| 国产成人在线小视频| 国模精品系列视频| 色av一区二区| 国产尤物一区二区在线| 成人偷拍自拍| 成人av毛片| 欧美黑人经典片免费观看| 国产成人精品视频在线观看| 欧美日韩一级二级三级| 东方aⅴ免费观看久久av| 免费欧美一区| 免费电影视频在线看| 国产精品欧美激情在线观看| 国产精品日韩一区| 亚洲成年人影院在线| 中文字幕一区在线观看| 免费欧美日韩| 日韩精选在线| 亚洲综合影视| 国产免费视频| 亚洲人体一区| 国产精品久久91| 亚洲精选在线观看| 午夜精品福利久久久| 国产高清久久久久| 中文字幕一区二区三区欧美日韩 | 91麻豆精东视频| 国产一区日韩一区| 色999久久久精品人人澡69| 青青青手机在线视频观看| 欧美激情 国产精品| 9a蜜桃久久久久久免费| 亚洲三级免费看| 精品久久久久久国产91| 91在线观看污| 蜜乳av另类精品一区二区| 亚洲精品白浆高清| 成人午夜精品| 毛片免费不卡| 日本成本人片免费观看| 蜜臀av色欲a片无码精品一区| 91嫩草视频在线观看| 欧美精品手机在线| 欧美日韩综合在线| 国产精品午夜在线观看| 精品一区精品二区高清| 亚洲一区在线| 亚洲黄色录像| 欧美电影在线观看网站| 成人在线观看免费网站| 神马午夜dy888| www.亚洲天堂网| 一区二区视频在线播放| 国产精品尤物福利片在线观看| 一区二区成人精品| 欧美一级欧美三级在线观看 | 色资源网站在线观看| 日韩精品一区二区在线视频| 国产精品对白一区二区三区| 日韩av大片免费看| 日韩中文视频免费在线观看| 日韩一区二区免费在线电影 | 日本18视频网站| 日韩欧美视频专区| 欧美国产日产图区| 波多野结衣在线观看一区二区三区| 国内激情视频在线观看| 免费在线国产| 午夜在线观看av|