在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

Linux中如何使用信號驅動式I/O?

FPGA之家 ? 來源:嵌入式Hacker ? 作者:嵌入式Hacker ? 2021-03-12 14:47 ? 次閱讀

一、Linux 的 5 種 IO 模型

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

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

四、最簡單的示例

五、擴展知識

一、Linux 的 5 種 IO 模型

阻塞式 I/O:

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

afa36cae-82f4-11eb-8b86-12bb97331649.png

點擊查看大圖

非阻塞式 I/O (O_NONBLOCK):

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

afe56582-82f4-11eb-8b86-12bb97331649.png

點擊查看大圖

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

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

b233d076-82f4-11eb-8b86-12bb97331649.png

點擊查看大圖

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

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

b285771e-82f4-11eb-8b86-12bb97331649.png

點擊查看大圖

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

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

點擊查看大圖

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

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

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

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

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

通過 sigaction() 來完成:

int sigaction(int signum, const struct sigaction *act, struct sigaction *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 近乎無用。

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

四、最簡單的示例

信號處理函數:

static volatile sig_atomic_t gotSigio = 0; static void handler(int sig) { gotSigio = 1; }

主程序:

int main(int argc, char *argv[]) { int flags, j, cnt; struct termios origTermios; char ch; struct sigaction sa; int done; /* Establish handler */ sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sa.sa_handler = handler; if (sigaction(SIGIO, &sa, NULL) == -1) { perror(“sigaction() ”); exit(1); } /* Set owner process */ if (fcntl(STDIN_FILENO, F_SETOWN, getpid()) == -1) { perror(“fcntl() / F_SETOWN ”); exit(1); } /* Enable “I/O possible” signaling and make I/O nonblocking */ 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; /* Read all available input until error (probably EAGAIN) or EOF */ while (read(STDIN_FILENO, &ch, 1) 》 0 && !done) { printf(“cnt=%d; read %c ”, cnt, ch); done = ch == ‘#’; } } } exit(0); }

運行效果:

。/build/sigio a cnt=0; read a cnt=0; read abc cnt=4; read a cnt=4; read b cnt=4; read c 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++網絡庫

原文標題:Linux-C 編程 | 3 分鐘快速了解信號驅動式 IO

文章出處:【微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

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

    關注

    87

    文章

    11419

    瀏覽量

    212274
  • 信號
    +關注

    關注

    11

    文章

    2834

    瀏覽量

    77707

原文標題:Linux-C 編程 | 3 分鐘快速了解信號驅動式 IO

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入學習-飛凌嵌入ElfBoard ELF 1板卡-I2C設備驅動Linux下的I2C驅動簡介

    的通信協議,其中一個設備作為主設備控制總線,并與多個從設備通信。在Linux內核I2C驅動主要由三部分組成:I2C核心、
    發表于 04-15 10:39

    I/O接口與I/O端口的區別

    在計算機系統I/O接口與I/O端口是實現CPU與外部設備數據交換的關鍵組件,它們在功能、結構、作用及運作機制上均存在顯著差異,卻又相互協
    的頭像 發表于 02-02 16:00 ?840次閱讀

    迅為RK3568開發板驅動指南Linux通用SPI設備驅動

    迅為RK3568開發板驅動指南Linux通用SPI設備驅動
    的頭像 發表于 01-23 11:02 ?2336次閱讀
    迅為RK3568開發板<b class='flag-5'>驅動</b>指南<b class='flag-5'>Linux</b><b class='flag-5'>中</b>通用SPI設備<b class='flag-5'>驅動</b>

    分布 I/O 配合高冗余 PLC,打造高效控制新典范

    在當今工業自動化領域,高效且穩定的控制解決方案始終是企業追求的目標。而分布 I/O 與高冗余 PLC 的完美配合,正如同強強聯合的雙子星,為工業生產帶來了前所未有的高效控制體驗,助力企業在激烈的市場競爭
    的頭像 發表于 12-27 17:40 ?374次閱讀
    分布<b class='flag-5'>式</b> <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 配合高冗余 PLC,打造高效控制新典范

    linux內核通用HID觸摸驅動

    linux內核,為HID觸摸面板實現了一個通用的驅動程序,位于/drivers/hid/hid-multitouch.c文件。hid觸摸驅動
    的頭像 發表于 10-29 10:55 ?1776次閱讀
    <b class='flag-5'>linux</b>內核<b class='flag-5'>中</b>通用HID觸摸<b class='flag-5'>驅動</b>

    直接I/O

    電子發燒友網站提供《直接I/O庫.pdf》資料免費下載
    發表于 10-14 10:55 ?0次下載
    直接<b class='flag-5'>I</b>/<b class='flag-5'>O</b>庫

    物聯網中常見的I/O擴展電路設計方案_IIC I/O擴展芯片

    物聯網系統為什么要使用 IIC I/O擴展芯片 ??在物聯網系統中使用IIC(也稱為I2C)I/O
    的頭像 發表于 09-24 11:29 ?1059次閱讀
    物聯網中常見的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>擴展電路設計方案_IIC <b class='flag-5'>I</b>/<b class='flag-5'>O</b>擴展芯片

    I/O模塊的主要作用有哪些

    點的信號。 我們來看看遠程I/O模塊的主要作用: 信號集中管理:在一個廣闊的工廠環境,設備可能散布在不同的區域。遠程
    的頭像 發表于 09-20 16:41 ?924次閱讀

    MSP430 I/O驅動段式LCD設計說明

    電子發燒友網站提供《MSP430 I/O驅動段式LCD設計說明.pdf》資料免費下載
    發表于 08-30 10:39 ?1次下載
    MSP430 <b class='flag-5'>I</b>/<b class='flag-5'>O</b>口<b class='flag-5'>驅動</b>段式LCD設計說明

    宜科FX20系列分布I/O再添兩位新成員

    宜科FX20系列分布I/O再添兩位新成員:四通道IO-Link主站模塊和單通道脈沖輸出模塊。這兩款功能模塊都是基于對IP20可擴展I/O
    的頭像 發表于 07-25 15:50 ?738次閱讀

    淺談如何克服FPGA I/O引腳分配挑戰

    所有這些條件將引腳分配給I/O組。 這也是真正開始工作的地方。在當前的設計流程,引腳分配時一項耗費時間的任務,在解決任何性能和信號完整性問題的過程
    發表于 07-22 00:40

    PLC的I/O點數是什么意思

    在工業自動化領域中,可編程邏輯控制器(PLC)扮演著至關重要的角色。PLC以其高可靠性、易編程性和強大的控制功能,廣泛應用于各種自動化系統。而在PLC的性能參數I/O點數是一個不
    的頭像 發表于 06-27 11:15 ?6578次閱讀

    便攜儲能種類豐富的I/O接口芯片

    電子發燒友網報道(文/黃山明)接口芯片,又稱為I/O接口芯片,是嵌入在電子設備的集成電路,其主要功能是作為中介,實現設備內部的處理器(如CPU)與外部設備之間的溝通與數據交換。它們在儲能系統
    的頭像 發表于 06-18 01:31 ?3263次閱讀

    嵌入32位高性能微處理器MCU雙網口I/O

    M120E以太網遠程I/O無線數據采集模塊是一款工業級、隔離設計、高可靠性、高穩定性和高精度數據采集模塊,嵌入32位高性能微處理器MCU,集成2路工業10/100M自適應以太網模塊里面。提供多種
    的頭像 發表于 05-08 16:47 ?1016次閱讀
    嵌入<b class='flag-5'>式</b>32位高性能微處理器MCU雙網口<b class='flag-5'>I</b>/<b class='flag-5'>O</b>

    軟件可配置模擬 I/O 的設計理念

    作者: Kenton Williston 曾幾何時,模擬 I/O 就是最專業、功能最固定的硬件。例如,電流驅動器和電壓傳感器是完全不同的零件,試圖顛倒其角色可謂是荒謬至極。 軟件可配置模擬 I
    的頭像 發表于 05-05 11:10 ?1143次閱讀
    軟件可配置模擬 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 的設計理念
    主站蜘蛛池模板: 国产簧片 | 99精品热女视频专线 | 成熟女性毛茸茸xx免费视频 | 色多多视频在线播放 | 天天操天天干天天爽 | 美国激情ap毛片 | 精品国产乱码久久久久久浪潮 | 999av视频| 日本一区二区视频 | 黄网站视频在线观看 | 日本免费三级网站 | 啪啪调教所29下拉式免费阅读 | 日韩毛片| 人人天天夜夜 | 播五月婷婷| 亚洲欧美v视色一区二区 | 五月在线观看 | 全黄性色大片 | 欧美狠狠 | 天天看天天爽 | 福利视频一区二区 | 午夜小影院 | 婷婷精品视频 | 男人午夜视频在线观看 | www亚洲一区| 天天视频一区二区三区 | 黄色3级| 老湿影院免费体验区 | 一区视频 | 久久久免费网站 | 91av免费在线观看 | 色视频在线免费看 | 天天噜噜日日噜噜久久综合网 | 4388x17亚洲最大成人网 | 亚洲视频黄 | 中文天堂在线最新版在线www | 中文字幕色网站 | 国卡一卡二卡三免费网站 | 97人人射| 精品热99 | 大尺度免费高清在线观看视频 |