日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高级IO(文件的读写)——阻塞式IO的困境、非阻塞式IO

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高级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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。