高级IO(文件的读写)——阻塞式IO的困境、非阻塞式IO
以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。
一、阻塞式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;
}
![](/assets/blank.gif)
二、非阻塞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相关推荐
- 同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO
IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...
- Android非阻塞读串口,Android 使用非阻塞的方式读写串口
上一篇博客简单介绍了Android 串口使用demo,项目开发中由于app 同学要求 例如 getMcuversion() 返回值是 当前单片机版本号,由于我们串口是阻塞的 ,所以我们接收到串口返回值 ...
- linux 管道非阻塞,linux – 管道上的非阻塞读取
可以在管道上进行非阻塞I / O吗? fcntl无法设置O_NONBLOCK. Linux编程接口的页面918包括一个表'从管道读取n个字节或FIFO(p)'的语义.此表列出了管道和FIFO的行为,其 ...
- 磁条卡,接触式IC卡,非接触式IC卡的优缺点
磁条卡的特点: 磁条卡由于其结构简单,存储容量小,安全保密性差,读写设备复杂且维护费用高,作为七.八十年代技术水平的产品已风光不再,即将面临淘汰. 智能IC卡与磁条卡相比有哪些优势? 接触式IC卡与磁 ...
- 非侵入式负荷matlab程序,非侵入式负荷分解之BLUED数据集
非侵入式负荷分解之BLUED数据集 非侵入式负荷分解之BLUED数据集 BLUED数据集包含大约8天之内来自单个美国家庭的高频(12 kHz)家庭级数据.该数据集还包含一个事件列表,该列表涉及家庭中每 ...
- java非侵入式接口实现_No-intrusive, 非侵入式接口设计
Go语言的Interface很大不同于C#,Java这种OOP语言的,其强大之处之一在于非侵入式设计. 基础复杂性是守恒的,需要解决的基本问题始终是需要解决的:最终的复杂性,却取决于基础复杂性彼此间的 ...
- pythontcp服务器如何关闭阻塞_python实现单线程多任务非阻塞TCP服务端
本文实例为大家分享了python实现单线程多任务非阻塞TCP服务端的具体代码,供大家参考,具体内容如下 # coding:utf-8 from socket import * # 1.创建服务器soc ...
- 微分算法 非侵入式负荷识别_非侵入式负荷监测的识别方法和关键技术
原标题:非侵入式负荷监测的识别方法和关键技术 在智能电网时代,必须突破目前用户家用电表只能读取用电总量,不能深入分析用户内部负荷成分,获取负荷信息有限的这一瓶颈,以完善用电信息采集系统和智能用电系统. ...
- java 非阻塞队列_java并发之非阻塞队列
非阻塞队列有:ArrayDeque.PriorityQueue.ConcurrentLinkedQueue 之前都说过阻塞队列了,其实差别都不大,阻塞和非阻塞的区别在于阻塞队列有put和take方法进 ...
- 【从零开始学习 SystemVerilog】3.5、SystemVerilog 控制流——阻塞(Blocking)与非阻塞(Non-Blocking)
文章目录 阻塞(Blocking) 非阻塞(Non-blocking) 阻塞(Blocking) Blocking赋值语句使用=赋值,并在程序块中一个接一个地执行.但是,这不会阻止在并行块中运行的语句 ...
最新文章
- python绘图实例-Python中turtle绘图学习笔记和实例
- JS 获取URL 后面的参数
- Linux命令之hexdump - ”十六“进制查看器
- 企业网站 源码 e-mail_天津seo优化套餐服务收费_天津网站优化关键词价格
- MongoDB查询用法大全
- python-数据类型-整数类型与浮点数据类型
- 收藏 | 有没有什么可以节省大量时间的 Deep Learning 效率神器?
- HBase完全分布式集群部署
- AVOD-代码理解系列(四)
- PS修改图片上的文字
- 如何学习一门新技术(经验分享)
- HTML+CSS静态页面网页设计作业——甜品奶茶店(19页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作
- 四川企立方电商:拼多多降价导致降权怎么
- 无感延迟智能降噪,一款无线蓝牙耳机体验分享,值得安利
- 洛谷 租用游艇 C++ Dijkstra 单源最短路/dp
- android load BKS error: wrong version of key store
- concurrent包
- ExaGrid入围2021年网络计算大奖
- html如何让窗口不在任务栏显示,电脑最小化窗口后无法在任务栏中显示怎么解决...
- 神经网络(NN)网络构建及模型算法介绍
热门文章
- 1.3 使用电脑测试MC20的电话语音功能
- 素数路(prime)
- 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数 2...
- jquery的$.extend、$.fn.extend、 jQuery.extend( target, object1, [objectN])作用及区别
- Dynamics CRM 2015 站点地图公告配置实体显示名称的变更
- Visual Studio 的码云扩展 V1.0.85 发布
- 2、nginx配置文件
- Android Ion 框架 文件下载
- XMPP文件传输(XEP-0096协议说明)
- 书摘---创业36条军规1:创业是怎么回事