哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

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

FPGA之家 ? 來源:嵌入式Hacker ? 作者:嵌入式Hacker ? 2021-03-12 14:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、Linux 的 5 種 IO 模型

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

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

四、最簡單的示例

五、擴展知識

一、Linux 的 5 種 IO 模型

阻塞式 I/O:

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

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

點擊查看大圖

非阻塞式 I/O (O_NONBLOCK):

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

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

點擊查看大圖

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

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

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

點擊查看大圖

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

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

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

點擊查看大圖

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

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

點擊查看大圖

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

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

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

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

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

通過 sigaction() 來完成:

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

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

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

通過 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ù)寫入到管道中;

管道的寫端關閉;

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

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

管道的讀端關閉;

3》 套接字

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

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

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

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

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

四、最簡單的示例

信號處理函數(shù):

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 #

該程序會先使能信號驅(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 是一個更好的選擇。

六、相關參考

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

6.2 I/O模型

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

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

63 其他備選的I/O模型

Linux 高性能服務器編程

8.3 I/O 模型

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

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

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

責任編輯:haq

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

    關注

    88

    文章

    11806

    瀏覽量

    219486
  • 信號
    +關注

    關注

    12

    文章

    2922

    瀏覽量

    80383

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何理解Linux內(nèi)核的PCIe驅(qū)動

    各異的芯片組,加上各種 PCI 設備自身獨特的功能需求,Linux 內(nèi)核的 PCI 支持遠比我們希望的要復雜得多。今天這篇文章,我們將從驅(qū)動開發(fā)的視角,梳理 Linux PCI 設備
    的頭像 發(fā)表于 04-11 17:22 ?1173次閱讀

    MAX11300:20端口可編程混合信號I/O芯片的深度解析

    MAX11300:20端口可編程混合信號I/O芯片的深度解析 在電子設計領域,混合信號I/O芯片
    的頭像 發(fā)表于 04-02 11:40 ?222次閱讀

    探索MAX11301:20端口可編程混合信號I/O的卓越之選

    探索MAX11301:20端口可編程混合信號I/O的卓越之選 在電子設計領域,一款功能強大且靈活的混合信號I/
    的頭像 發(fā)表于 03-26 15:30 ?115次閱讀

    MAX11311:十二通道可配置混合信號I/O芯片的深度解析

    開關和GPIO的12端口可配置混合信號I/O芯片,為工程師們提供了強大而靈活的解決方案。本文將深入探討MAX11311的特性、功能、應用以及使用過程的注意事項。 文件下載: MAX1
    的頭像 發(fā)表于 03-26 15:30 ?139次閱讀

    Linux內(nèi)核三大核心模塊深度解析:調(diào)度、內(nèi)存與I/O

    Linux內(nèi)核作為操作系統(tǒng)的核心,其進程調(diào)度、內(nèi)存管理和文件I/O三大模塊共同決定了系統(tǒng)的性能與穩(wěn)定性。無論是多核服務器的高并發(fā)處理,還是嵌入設備的資源受限場景,深入理解這些底層機制
    的頭像 發(fā)表于 03-12 09:00 ?216次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核三大核心模塊深度解析:調(diào)度、內(nèi)存與<b class='flag-5'>I</b>/<b class='flag-5'>O</b>

    MAX6956:2 線接口的 LED 顯示驅(qū)動I/O 擴展器的深度解析

    MAX6956:2 線接口的 LED 顯示驅(qū)動I/O 擴展器的深度解析 在電子設計領域,LED 顯示驅(qū)動I/
    的頭像 發(fā)表于 02-03 15:15 ?284次閱讀

    MAX6946:10端口恒流LED驅(qū)動器與I/O擴展器的技術解析

    MAX6946/MAX6947:10端口恒流LED驅(qū)動器與I/O擴展器的技術解析 在電子設計領域,LED驅(qū)動器和I/
    的頭像 發(fā)表于 02-02 15:55 ?272次閱讀

    MAX6947:10端口恒流LED驅(qū)動I/O擴展器的深度解析

    MAX6946/MAX6947:10端口恒流LED驅(qū)動I/O擴展器的深度解析 在電子設計領域,LED驅(qū)動I/
    的頭像 發(fā)表于 02-02 15:50 ?306次閱讀

    穎電子8位單片機的I/O設置介紹

    在嵌入系統(tǒng)設計,單片機的I/O端口設置是基礎且關鍵的一環(huán)。今天我們來詳細解析穎電子8位單片機的I
    的頭像 發(fā)表于 12-30 09:37 ?865次閱讀
    <b class='flag-5'>中</b>穎電子8位單片機的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>設置介紹

    飛凌嵌入ElfBoard-文件I/O的深入學習之異步I/O

    I/O多路復用,進程通過系統(tǒng)調(diào)用select或poll來主動查詢文件描述符上是否可以執(zhí)行I/O操作。而在異步
    發(fā)表于 12-05 11:23

    飛凌嵌入ElfBoard-文件I/O的深入學習之I/O多路復用

    程序既要讀取鼠標、又要讀取鍵盤,多路讀取??梢圆捎脙蓚€功能幾乎相同的系統(tǒng)調(diào)用來執(zhí)行I/O多路復用操作,分別是系統(tǒng)調(diào)用select和poll(當然兩者存在相同的一個缺點就是,當包含大量文件描述符的數(shù)組
    發(fā)表于 12-05 11:18

    飛凌嵌入ElfBoard-文件I/O的深入學習之阻塞I/O與非阻塞I/O

    1.4.1.1 概念 阻塞I/O顧名思義就是對文件的I/O操作是阻塞的,即假如對某些類型文件(管道文件、網(wǎng)絡設備文件和字符設備文件)進行讀
    發(fā)表于 12-01 13:07

    MR30系列分布I/O在造型機產(chǎn)線的應用

    ,該公司在最新一代造型機生產(chǎn)線引入明達技術MR30系列分布I/O,通過分布信號采集與控制,
    的頭像 發(fā)表于 10-30 14:02 ?631次閱讀
    MR30系列分布<b class='flag-5'>式</b><b class='flag-5'>I</b>/<b class='flag-5'>O</b>在造型機產(chǎn)線的應用

    MR30分布I/O模塊在涂裝產(chǎn)線的應用

    某裝備制造企業(yè)主要從事自動化焊割、涂裝生產(chǎn)線的設計與制造,其中涂裝生產(chǎn)線涉及噴砂、噴漆、熱處理、廢氣處理等工藝。明達技術的MR30系列分布I/O,性能穩(wěn)定,易上手,方便接線,助力企業(yè)提升產(chǎn)品
    的頭像 發(fā)表于 08-27 15:38 ?698次閱讀
    MR30分布<b class='flag-5'>式</b><b class='flag-5'>I</b>/<b class='flag-5'>O</b>模塊在涂裝產(chǎn)線<b class='flag-5'>中</b>的應用

    MAX7325 I2C端口擴展器,提供8路推挽I/O和8個漏極開路I/O技術手冊

    MAX7325 2線串行接口外設具有16路I/O端口。其中8路為推挽輸出,另外8路為I/O端口,帶有可選擇的內(nèi)部上拉和瞬態(tài)檢測功能。8路I/
    的頭像 發(fā)表于 05-22 15:27 ?1108次閱讀
    MAX7325 <b class='flag-5'>I</b>2C端口擴展器,提供8路推挽<b class='flag-5'>式</b><b class='flag-5'>I</b>/<b class='flag-5'>O</b>和8個漏極開路<b class='flag-5'>I</b>/<b class='flag-5'>O</b>技術手冊
    邛崃市| 邵武市| 纳雍县| 察雅县| 仲巴县| 大方县| 鹤峰县| 池州市| 界首市| 新民市| 墨江| 庄浪县| 茂名市| 太湖县| 崇文区| 垫江县| 昌邑市| 北辰区| 石棉县| 霍邱县| 五家渠市| 汕尾市| 大洼县| 泸水县| 塔河县| 高雄市| 广昌县| 合作市| 邳州市| 犍为县| 满城县| 临颍县| 鹤庆县| 通化县| 南雄市| 台中市| 开化县| 博白县| 英吉沙县| 平罗县| 绍兴县|