当前位置: 首页 > news >正文

阻塞型IO与非阻塞型IO

阻塞IO与非阻塞IO

一.IO模型

IO的本质是基于操作系统接口来控制底层的硬件之间数据传输,并且在操作系统中实现了多种不同的IO方式(模型),比较常见的有下列三种

  • 阻塞型IO模型
  • 非阻塞型IO模型
  • 多路复用IO模型(重点!重点!重点!)

二。阻塞型IO

当进程发出IO请求后,阻塞进程(让进程进入睡眠状态),资源就绪后唤醒进程继续执行。
注意:一般默认的 IO 操作都是阻塞型 IO
在这里插入图片描述
示例代码:从标准输入读取数据,并进行输出

#include <stdio.h>
int main()
{int num;cin >> num;cout << num << endl;return 0;
}

特点:会一直等待,直到数据就绪

三 非阻塞型IO

当进程发出IO请求后,无论资源是否就绪都会立即返回,相应的模型如下:
在这里插入图片描述
实现非阻塞型IO,需要设置 O_NONBLOCK 标志,设置有两种方式

  • 可以通过调用 fcntl 函数来进行设置
    在这里插入图片描述

  • 通过open函数来进行设置,一般在打开文件时就需要设置

fcntl 函数

函数头文件
#include <unistd.h>
#include <fcntl.h>
函数原型
int fcntl(int fd, int cmd,/* arg */ );函数功能
通过命令字(cmd)来设置文件描述符函数参数
fd:文件描述符
cmd:控制命令字F_GETFD:获取文件描述符标志F_SETFD:设置文件描述符标志F_GETFL:获取文件状态标志F_SETFL:设置文件状态标志

示例代码:将标准输入设置为非阻塞

示例代码:将标准输入设置为非阻塞

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{// 获取文件状态标志int flags = fcntl(0,F_GETFL);// 追加非阻塞标志flags |= O_NONBLOCK;// 设置文件状态标志int ret = fcntl(0,F_SETFL,flags);if(ret){perror("fcntl[F_SETFL] error.");exit(EXIT_FAILURE);}int number=10;scanf("%d",&number);printf("number=%d\n",number);for(int i=1;i<10;i++){printf("%3d",i);}putchar('\n');return 0;
}

在这里插入图片描述
从运行结果可以看出:程序不会等待用户输入,会立即返回


http://www.mrgr.cn/news/37020.html

相关文章:

  • 【CSS/HTML】圣杯布局和双飞翼布局实现两侧宽度固定,中间宽度自适应及其他扩展实现
  • 嵌入式中CW32多功能测试笔实现
  • C语言指针系列1——初识指针
  • 解决毕业论文难题!推荐7款AI自动生成论文工具网站
  • C++11新特性—std:function模板类
  • 【C++位图】构建灵活的空间效率工具
  • Keyence_PL_MC_HslCommunication import MelsecMcNet
  • 【RabbitMQ】消息堆积、推拉模式
  • 【智能控制】第15章 智能优化算法,遗传算法
  • 【Linux】项目自动化构建工具-make/Makefile 详解
  • 代码随想录算法训练营第四十二天 | 188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费
  • Java面试题之JVM20问
  • Redis常用命令笔记
  • Android——运行时动态申请权限
  • AIGAME平台的由来与未来展望 —— 蒙特加密基金推动区块链与AI融合创新
  • 红黑树|定义、左旋函数、右旋函数和对插入结点的修复
  • 【系统架构设计师】需要掌握的专业术语200个及简称
  • HttpServletRequestWrapper这个类有什么作用?
  • (done) 使用泰勒展开证明欧拉公式
  • vscode【实用插件】Project Manager 项目管理