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