色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

Linux中如何使用信號(hào)驅(qū)動(dòng)式I/O?

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

一、Linux 的 5 種 IO 模型

二、如何使用信號(hào)驅(qū)動(dòng)式 I/O?

三、內(nèi)核何時(shí)會(huì)發(fā)送 “IO 就緒” 信號(hào)?

四、最簡(jiǎn)單的示例

五、擴(kuò)展知識(shí)

一、Linux 的 5 種 IO 模型

阻塞式 I/O:

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

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

點(diǎn)擊查看大圖

非阻塞式 I/O (O_NONBLOCK):

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

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

點(diǎn)擊查看大圖

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

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

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

點(diǎn)擊查看大圖

信號(hào)驅(qū)動(dòng)式 I/O (SIGIO):

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

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

點(diǎn)擊查看大圖

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

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

點(diǎn)擊查看大圖

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

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

二、如何使用信號(hào)驅(qū)動(dòng)式 I/O?

一般通過(guò)如下 6 個(gè)步驟來(lái)使用信號(hào)驅(qū)動(dòng)式 I/O 模型。

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

通過(guò) sigaction() 來(lái)完成:

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

默認(rèn)情況下,這個(gè)通知信號(hào)為 SIGIO。

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

通過(guò) fcntl() 的 F_SETOWN 操作來(lái)完成:

fcntl(fd, F_SETOWN, pid)

屬主是當(dāng)文件描述符上可執(zhí)行 I/O 時(shí),會(huì)接收到通知信號(hào)的進(jìn)程或進(jìn)程組。

pid 為正整數(shù)時(shí),代表了進(jìn)程 ID 號(hào)。

pid 為負(fù)整數(shù)時(shí),它的絕對(duì)值就代表了進(jìn)程組 ID 號(hào)。

3》 使能非阻塞 I/O。

通過(guò) fcntl() 的 F_SETFL 操作來(lái)完成:

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

4》 使能信號(hào)驅(qū)動(dòng) I/O。

通過(guò) fcntl() 的 F_SETFL 操作來(lái)完成:

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

5》 進(jìn)程等待 “IO 就緒” 信號(hào)的到來(lái)。

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

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

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

原因:

信號(hào)驅(qū)動(dòng) I/O 提供的是邊緣觸發(fā)通知,即只有當(dāng) I/O 事件發(fā)生時(shí)我們才會(huì)收到通知,

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

三、內(nèi)核何時(shí)會(huì)發(fā)送 “IO 就緒” 信號(hào)?

對(duì)于不同類(lèi)型的文件描述符,情況不一樣。

1》 終端

對(duì)于終端,當(dāng)有新的輸入時(shí)會(huì)會(huì)產(chǎn)生信號(hào)。

2》 管道和 FIFO

對(duì)于讀端,下列情況會(huì)產(chǎn)生信號(hào):

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

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

對(duì)于寫(xiě)端,下列情況會(huì)產(chǎn)生信號(hào):

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

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

3》 套接字

對(duì)于 UDP 套接字,下列情況會(huì)產(chǎn)生信號(hào):

數(shù)據(jù)報(bào)到達(dá)套接字;

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

對(duì)于 TCP 套接字,信號(hào)驅(qū)動(dòng)式 I/O 近乎無(wú)用。

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

四、最簡(jiǎn)單的示例

信號(hào)處理函數(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); }

運(yùn)行效果:

。/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 #

該程序會(huì)先使能信號(hào)驅(qū)動(dòng) IO,然后循環(huán)執(zhí)行計(jì)數(shù)操作。

當(dāng)有 IO 就緒信號(hào)到來(lái)時(shí),會(huì)去終端讀取數(shù)據(jù)并打印出來(lái),然后繼續(xù)執(zhí)行計(jì)數(shù)操作。

五、擴(kuò)展知識(shí)

I/O 多路復(fù)用 、信號(hào)驅(qū)動(dòng) I/O 以及 epoll 機(jī)制可用于監(jiān)視多個(gè)文件描述符。

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

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

信號(hào)驅(qū)動(dòng) I/O 的缺點(diǎn):

信號(hào)的處理流程較為復(fù)雜;

無(wú)法指定需要監(jiān)控的事件類(lèi)型。

Linux 特有的 epoll 是一個(gè)更好的選擇。

六、相關(guān)參考

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

6.2 I/O模型

25 信號(hào)驅(qū)動(dòng)式I/O

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

63 其他備選的I/O模型

Linux 高性能服務(wù)器編程

8.3 I/O 模型

Linux 多線(xiàn)程服務(wù)端編程_使用muduo C++網(wǎng)絡(luò)庫(kù)

原文標(biāo)題:Linux-C 編程 | 3 分鐘快速了解信號(hào)驅(qū)動(dòng)式 IO

文章出處:【微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

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

    關(guān)注

    87

    文章

    11449

    瀏覽量

    212700
  • 信號(hào)
    +關(guān)注

    關(guān)注

    11

    文章

    2841

    瀏覽量

    77865

原文標(biāo)題:Linux-C 編程 | 3 分鐘快速了解信號(hào)驅(qū)動(dòng)式 IO

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

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

    MAX7325 I2C端口擴(kuò)展器,提供8路推挽I/O和8個(gè)漏極開(kāi)路I/O技術(shù)手冊(cè)

    MAX7325 2線(xiàn)串行接口外設(shè)具有16路I/O端口。其中8路為推挽輸出,另外8路為I/O端口,帶有可選擇的內(nèi)部上拉和瞬態(tài)檢測(cè)功能。8路I/
    的頭像 發(fā)表于 05-22 15:27 ?106次閱讀
    MAX7325 <b class='flag-5'>I</b>2C端口擴(kuò)展器,提供8路推挽<b class='flag-5'>式</b><b class='flag-5'>I</b>/<b class='flag-5'>O</b>和8個(gè)漏極開(kāi)路<b class='flag-5'>I</b>/<b class='flag-5'>O</b>技術(shù)手冊(cè)

    簡(jiǎn)儀科技高性能PXI模擬I/O模塊JY-951概述

    JY-9511 是一款專(zhuān)為動(dòng)態(tài)測(cè)量環(huán)境精密數(shù)據(jù)采集與信號(hào)生成設(shè)計(jì)的高性能 PXI 模擬 I/O 模塊。
    的頭像 發(fā)表于 05-09 16:33 ?128次閱讀

    嵌入學(xué)習(xí)-飛凌嵌入ElfBoard ELF 1板卡-I2C設(shè)備驅(qū)動(dòng)Linux下的I2C驅(qū)動(dòng)簡(jiǎn)介

    的通信協(xié)議,其中一個(gè)設(shè)備作為主設(shè)備控制總線(xiàn),并與多個(gè)從設(shè)備通信。在Linux內(nèi)核,I2C驅(qū)動(dòng)主要由三部分組成:I2C核心、
    發(fā)表于 04-15 10:39

    I/O接口與I/O端口的區(qū)別

    在計(jì)算機(jī)系統(tǒng),I/O接口與I/O端口是實(shí)現(xiàn)CPU與外部設(shè)備數(shù)據(jù)交換的關(guān)鍵組件,它們?cè)诠δ?、結(jié)構(gòu)、作用及運(yùn)作機(jī)制上均存在顯著差異,卻又相互協(xié)
    的頭像 發(fā)表于 02-02 16:00 ?1033次閱讀

    迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)指南Linux通用SPI設(shè)備驅(qū)動(dòng)

    迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)指南Linux通用SPI設(shè)備驅(qū)動(dòng)
    的頭像 發(fā)表于 01-23 11:02 ?2465次閱讀
    迅為RK3568開(kāi)發(fā)板<b class='flag-5'>驅(qū)動(dòng)</b>指南<b class='flag-5'>Linux</b><b class='flag-5'>中</b>通用SPI設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>

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

    在當(dāng)今工業(yè)自動(dòng)化領(lǐng)域,高效且穩(wěn)定的控制解決方案始終是企業(yè)追求的目標(biāo)。而分布 I/O 與高冗余 PLC 的完美配合,正如同強(qiáng)強(qiáng)聯(lián)合的雙子星,為工業(yè)生產(chǎn)帶來(lái)了前所未有的高效控制體驗(yàn),助力企業(yè)在激烈的市場(chǎng)競(jìng)爭(zhēng)
    的頭像 發(fā)表于 12-27 17:40 ?417次閱讀
    分布<b class='flag-5'>式</b> <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 配合高冗余 PLC,打造高效控制新典范

    linux內(nèi)核通用HID觸摸驅(qū)動(dòng)

    linux內(nèi)核,為HID觸摸面板實(shí)現(xiàn)了一個(gè)通用的驅(qū)動(dòng)程序,位于/drivers/hid/hid-multitouch.c文件。hid觸摸驅(qū)動(dòng)
    的頭像 發(fā)表于 10-29 10:55 ?1939次閱讀
    <b class='flag-5'>linux</b>內(nèi)核<b class='flag-5'>中</b>通用HID觸摸<b class='flag-5'>驅(qū)動(dòng)</b>

    直接I/O庫(kù)

    電子發(fā)燒友網(wǎng)站提供《直接I/O庫(kù).pdf》資料免費(fèi)下載
    發(fā)表于 10-14 10:55 ?0次下載
    直接<b class='flag-5'>I</b>/<b class='flag-5'>O</b>庫(kù)

    物聯(lián)網(wǎng)中常見(jiàn)的I/O擴(kuò)展電路設(shè)計(jì)方案_IIC I/O擴(kuò)展芯片

    物聯(lián)網(wǎng)系統(tǒng)為什么要使用 IIC I/O擴(kuò)展芯片 ??在物聯(lián)網(wǎng)系統(tǒng)中使用IIC(也稱(chēng)為I2C)I/O
    的頭像 發(fā)表于 09-24 11:29 ?1157次閱讀
    物聯(lián)網(wǎng)中常見(jiàn)的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>擴(kuò)展電路設(shè)計(jì)方案_IIC <b class='flag-5'>I</b>/<b class='flag-5'>O</b>擴(kuò)展芯片

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

    點(diǎn)的信號(hào)。 我們來(lái)看看遠(yuǎn)程I/O模塊的主要作用: 信號(hào)集中管理:在一個(gè)廣闊的工廠環(huán)境,設(shè)備可能散布在不同的區(qū)域。遠(yuǎn)程
    的頭像 發(fā)表于 09-20 16:41 ?1008次閱讀

    MSP430 I/O驅(qū)動(dòng)段式LCD設(shè)計(jì)說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《MSP430 I/O驅(qū)動(dòng)段式LCD設(shè)計(jì)說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 08-30 10:39 ?1次下載
    MSP430 <b class='flag-5'>I</b>/<b class='flag-5'>O</b>口<b class='flag-5'>驅(qū)動(dòng)</b>段式LCD設(shè)計(jì)說(shuō)明

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

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

    淺談如何克服FPGA I/O引腳分配挑戰(zhàn)

    所有這些條件將引腳分配給I/O組。 這也是真正開(kāi)始工作的地方。在當(dāng)前的設(shè)計(jì)流程,引腳分配時(shí)一項(xiàng)耗費(fèi)時(shí)間的任務(wù),在解決任何性能和信號(hào)完整性問(wèn)題的過(guò)程
    發(fā)表于 07-22 00:40

    PLC的I/O點(diǎn)數(shù)是什么意思

    在工業(yè)自動(dòng)化領(lǐng)域中,可編程邏輯控制器(PLC)扮演著至關(guān)重要的角色。PLC以其高可靠性、易編程性和強(qiáng)大的控制功能,廣泛應(yīng)用于各種自動(dòng)化系統(tǒng)。而在PLC的性能參數(shù),I/O點(diǎn)數(shù)是一個(gè)不
    的頭像 發(fā)表于 06-27 11:15 ?7105次閱讀

    便攜儲(chǔ)能種類(lèi)豐富的I/O接口芯片

    電子發(fā)燒友網(wǎng)報(bào)道(文/黃山明)接口芯片,又稱(chēng)為I/O接口芯片,是嵌入在電子設(shè)備的集成電路,其主要功能是作為中介,實(shí)現(xiàn)設(shè)備內(nèi)部的處理器(如CPU)與外部設(shè)備之間的溝通與數(shù)據(jù)交換。它們?cè)趦?chǔ)能系統(tǒng)
    的頭像 發(fā)表于 06-18 01:31 ?3327次閱讀
    主站蜘蛛池模板: 神马电影dy888午夜我不卡 | 亚洲福利精品电影在线观看 | 久久精品AV一区二区无码 | 99久久久无码国产精精品 | 成人AV精品视频 | 亚洲 小说 欧美 激情 另类 | 野花影院手机在线观看 | 杨幂视频1分11未删减在线观看 | 么公在浴室了我的奶 | 曰韩一本道高清无码av | 日本工口生肉全彩大全 | 国产伦精品一区二区三区 | 男人舔女人的阴部黄色骚虎视频 | 日韩精品亚洲专区在线电影不卡 | 高清国产一区 | 国产精品高潮呻吟AV久久96 | 女人张腿让男人桶免费 | 小舞被爆操| 国产精品人妻无码免费A片导航 | 国产精品一区二区人妻无码 | 久久热国产在线视频 | 欧美性猛交xxxxxxxx软件 | 女人会操出水图 | 宅男午夜大片又黄又爽大片 | 国产成人理在线观看视频 | 亚洲AVAV天堂AV在线网爱情 | 亚洲 欧美 日韩 精品 自拍 | 古装性艳史电影在线看 | 好大好硬好湿再深一点网站 | 一区二区乱子伦在线播放 | 狠狠色狠狠色综合系列 | 小莹的性荡生活40章 | 色欲AV蜜臀AV在线观看麻豆 | 九色PORNY蝌蚪视频首页 | 嫩草影院在线观看精品 | 综合精品欧美日韩国产在线 | bt天堂午夜国产精品 | 久久国产精品麻豆AV影视 | 国产精品欧美一区二区在线看 | 在线日本v二区不卡 | 好男人视频免费高清在线观看www |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品