以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。

一、阻塞式IO的困境

1、程序中读取键盘

int main(void)
{// 读取键盘// 键盘就是标准输入,stdinchar buf[100];memset(buf, 0, sizeof(buf));printf("before read.\n");read(0, buf, 5);printf("读出的内容是:[%s].\n", buf);return 0;
}

  • 注意是行缓冲的,在输入回车时,才结束输入。

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("读出的内容是:[%s].\n", buf);return 0;
}

3、程序中同时读取键盘和鼠标

  • 希望实现动键盘就显示键盘的内容,动鼠标就显示鼠标的内容;
  • 但是下面的程序实际现象是:顺着程序先鼠标再键盘则顺利显示;先键盘的话,会被鼠标阻塞住。
#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("鼠标读出的内容是:[%s].\n", buf);// 读键盘memset(buf, 0, sizeof(buf));printf("before 键盘 read.\n");read(0, buf, 5);//键盘就是标准输入,stdin,用0表示,它是默认打开的。printf("键盘读出的内容是:[%s].\n", buf);return 0;
}

二、非阻塞IO

1、阻塞的概念

  • 阻塞:当前进程的执行条件不满足,内核将进程挂起,直到进程的执行条件满足。
  • linux在设计时,默认阻塞式。

2、为什么有阻塞式?

(1)常见的阻塞

  • wait、pause、sleep等函数;
  • read或write某些文件时(read和write本身没有此属性,看读取对象是阻塞还是非阻塞的,比如键盘和鼠标就是阻塞式的)。

(2)阻塞式的好处

  • 简单容易实现;
  • 有利于充分发挥CPU的性能。

3、非阻塞

(1)为什么要实现非阻塞?

  • 阻塞式IO的困境。

(2)如何实现非阻塞IO访问?

  • 打开文件时添加O_NONBLOCK标志(非阻塞式);
  • 或使用fcntl函数(可以普通地打开文件之后,再设置文件描述符的属性)。

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

  1. 同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  2. Android非阻塞读串口,Android 使用非阻塞的方式读写串口

    上一篇博客简单介绍了Android 串口使用demo,项目开发中由于app 同学要求 例如 getMcuversion() 返回值是 当前单片机版本号,由于我们串口是阻塞的 ,所以我们接收到串口返回值 ...

  3. linux 管道非阻塞,linux – 管道上的非阻塞读取

    可以在管道上进行非阻塞I / O吗? fcntl无法设置O_NONBLOCK. Linux编程接口的页面918包括一个表'从管道读取n个字节或FIFO(p)'的语义.此表列出了管道和FIFO的行为,其 ...

  4. 磁条卡,接触式IC卡,非接触式IC卡的优缺点

    磁条卡的特点: 磁条卡由于其结构简单,存储容量小,安全保密性差,读写设备复杂且维护费用高,作为七.八十年代技术水平的产品已风光不再,即将面临淘汰. 智能IC卡与磁条卡相比有哪些优势? 接触式IC卡与磁 ...

  5. 非侵入式负荷matlab程序,非侵入式负荷分解之BLUED数据集

    非侵入式负荷分解之BLUED数据集 非侵入式负荷分解之BLUED数据集 BLUED数据集包含大约8天之内来自单个美国家庭的高频(12 kHz)家庭级数据.该数据集还包含一个事件列表,该列表涉及家庭中每 ...

  6. java非侵入式接口实现_No-intrusive, 非侵入式接口设计

    Go语言的Interface很大不同于C#,Java这种OOP语言的,其强大之处之一在于非侵入式设计. 基础复杂性是守恒的,需要解决的基本问题始终是需要解决的:最终的复杂性,却取决于基础复杂性彼此间的 ...

  7. pythontcp服务器如何关闭阻塞_python实现单线程多任务非阻塞TCP服务端

    本文实例为大家分享了python实现单线程多任务非阻塞TCP服务端的具体代码,供大家参考,具体内容如下 # coding:utf-8 from socket import * # 1.创建服务器soc ...

  8. 微分算法 非侵入式负荷识别_非侵入式负荷监测的识别方法和关键技术

    原标题:非侵入式负荷监测的识别方法和关键技术 在智能电网时代,必须突破目前用户家用电表只能读取用电总量,不能深入分析用户内部负荷成分,获取负荷信息有限的这一瓶颈,以完善用电信息采集系统和智能用电系统. ...

  9. java 非阻塞队列_java并发之非阻塞队列

    非阻塞队列有:ArrayDeque.PriorityQueue.ConcurrentLinkedQueue 之前都说过阻塞队列了,其实差别都不大,阻塞和非阻塞的区别在于阻塞队列有put和take方法进 ...

  10. 【从零开始学习 SystemVerilog】3.5、SystemVerilog 控制流——阻塞(Blocking)与非阻塞(Non-Blocking)

    文章目录 阻塞(Blocking) 非阻塞(Non-blocking) 阻塞(Blocking) Blocking赋值语句使用=赋值,并在程序块中一个接一个地执行.但是,这不会阻止在并行块中运行的语句 ...

最新文章

  1. python绘图实例-Python中turtle绘图学习笔记和实例
  2. JS 获取URL 后面的参数
  3. Linux命令之hexdump - ”十六“进制查看器
  4. 企业网站 源码 e-mail_天津seo优化套餐服务收费_天津网站优化关键词价格
  5. MongoDB查询用法大全
  6. python-数据类型-整数类型与浮点数据类型
  7. 收藏 | 有没有什么可以节省大量时间的 Deep Learning 效率神器?
  8. HBase完全分布式集群部署
  9. AVOD-代码理解系列(四)
  10. PS修改图片上的文字
  11. 如何学习一门新技术(经验分享)
  12. HTML+CSS静态页面网页设计作业——甜品奶茶店(19页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作
  13. 四川企立方电商:拼多多降价导致降权怎么
  14. 无感延迟智能降噪,一款无线蓝牙耳机体验分享,值得安利
  15. 洛谷 租用游艇 C++ Dijkstra 单源最短路/dp
  16. android load BKS error: wrong version of key store
  17. concurrent包
  18. ExaGrid入围2021年网络计算大奖
  19. html如何让窗口不在任务栏显示,电脑最小化窗口后无法在任务栏中显示怎么解决...
  20. 神经网络(NN)网络构建及模型算法介绍

热门文章

  1. 1.3 使用电脑测试MC20的电话语音功能
  2. 素数路(prime)
  3. 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数 2...
  4. jquery的$.extend、$.fn.extend、 jQuery.extend( target, object1, [objectN])作用及区别
  5. Dynamics CRM 2015 站点地图公告配置实体显示名称的变更
  6. Visual Studio 的码云扩展 V1.0.85 发布
  7. 2、nginx配置文件
  8. Android Ion 框架 文件下载
  9. XMPP文件传输(XEP-0096协议说明)
  10. 书摘---创业36条军规1:创业是怎么回事