高级IO(文件的读写)——阻塞式IO的困境、非阻塞式IO
生活随笔
收集整理的這篇文章主要介紹了
高级IO(文件的读写)——阻塞式IO的困境、非阻塞式IO
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
以下內(nèi)容源于朱有鵬《物聯(lián)網(wǎng)大講堂》課程的學(xué)習(xí)整理,如有侵權(quán),請告知刪除。
一、阻塞式IO的困境
1、程序中讀取鍵盤
int main(void) {// 讀取鍵盤// 鍵盤就是標(biāo)準(zhǔn)輸入,stdinchar buf[100];memset(buf, 0, sizeof(buf));printf("before read.\n");read(0, buf, 5);printf("讀出的內(nèi)容是:[%s].\n", buf);return 0; }
- 注意是行緩沖的,在輸入回車時,才結(jié)束輸入。
2、程序中讀取鼠標(biāo)
int main(void) {// 讀取鼠標(biāo)int fd = -1;char buf[200];fd = open("/dev/input/mouse1", O_RDONLY);if (fd < 0){perror("open:");return -1;}memset(buf, 0, sizeof(buf));printf("before read.\n");read(fd, buf, 50);printf("讀出的內(nèi)容是:[%s].\n", buf);return 0; }
3、程序中同時讀取鍵盤和鼠標(biāo)
- 希望實現(xiàn)動鍵盤就顯示鍵盤的內(nèi)容,動鼠標(biāo)就顯示鼠標(biāo)的內(nèi)容;
- 但是下面的程序?qū)嶋H現(xiàn)象是:順著程序先鼠標(biāo)再鍵盤則順利顯示;先鍵盤的話,會被鼠標(biāo)阻塞住。
#include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main(void) {// 讀取鼠標(biāo)int fd = -1;char buf[200];fd = open("/dev/input/mouse1", O_RDONLY);if (fd < 0){perror("open:");return -1;}memset(buf, 0, sizeof(buf));printf("before 鼠標(biāo) read.\n");read(fd, buf, 50);printf("鼠標(biāo)讀出的內(nèi)容是:[%s].\n", buf);// 讀鍵盤memset(buf, 0, sizeof(buf));printf("before 鍵盤 read.\n");read(0, buf, 5);//鍵盤就是標(biāo)準(zhǔn)輸入,stdin,用0表示,它是默認(rèn)打開的。printf("鍵盤讀出的內(nèi)容是:[%s].\n", buf);return 0; }
二、非阻塞IO
1、阻塞的概念
- 阻塞:當(dāng)前進(jìn)程的執(zhí)行條件不滿足,內(nèi)核將進(jìn)程掛起,直到進(jìn)程的執(zhí)行條件滿足。
- linux在設(shè)計時,默認(rèn)阻塞式。
2、為什么有阻塞式?
(1)常見的阻塞
- wait、pause、sleep等函數(shù);
- read或write某些文件時(read和write本身沒有此屬性,看讀取對象是阻塞還是非阻塞的,比如鍵盤和鼠標(biāo)就是阻塞式的)。
(2)阻塞式的好處
- 簡單容易實現(xiàn);
- 有利于充分發(fā)揮CPU的性能。
3、非阻塞
(1)為什么要實現(xiàn)非阻塞?
- 阻塞式IO的困境。
(2)如何實現(xiàn)非阻塞IO訪問?
- 打開文件時添加O_NONBLOCK標(biāo)志(非阻塞式);
- 或使用fcntl函數(shù)(可以普通地打開文件之后,再設(shè)置文件描述符的屬性)。
總結(jié)
以上是生活随笔為你收集整理的高级IO(文件的读写)——阻塞式IO的困境、非阻塞式IO的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keras中文官方文档(离线版)
- 下一篇: 手游方舟怎么输入代码_单机方舟不能输入代