59 阻塞和非阻塞IO

阻塞式io

一个简单的用户输入回显功能,在用户未输入内容时,会一直阻塞住

#include <iostream>
#include <unistd.h>using namespace std;
int main()
{char buff[1024];while (true){cout << "please enter@ ";fflush(stdout);ssize_t n = read(0, buff, sizeof(buff));if (n > 0){buff[n - 1] = 0;cout << "echo:" << buff << endl;}else if (n == 0){cout << "read finish" << endl;break;}else if (n < 0){cout << "read error" << endl;break;}}return 0;
}

fctnl

一个文件描述符,默认都是阻塞io
函数原型如下:

#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, … /* arg */ );

传入的cmd值不同,后面追加的参数也不相同
fctnl函数有5种功能:

  • 复制一个现有的描述符 (cmd=F_DEPFD)
  • 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)
  • 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)
  • 获得/设置异步io所有权(cmd=F_GETOWN或F_SETOWN)
  • 获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW)

此处用第三种功能,设置文件状态标记,就可以将一个文件描述符设置为非阻塞

实现非阻塞

实现函数SetNoBlock,基于fcntl,实现这个函数,将文件描述符设置为非阻塞

void SetNoBlock(int fd)
{int f1 = fcntl(fd, F_GETFL);if (f1 < 0){perror("fctnl");return;}fcntl(fd, F_SETFL, f1 | O_NONBLOCK);cout << " set " << fd << " nonblock done" << endl;
}

使用F_GETFL将当前的文件描述符的属性取出来(这是一个位图)
然后再使用F_SETFL将文件描述符设置回去,设置回去的同时,加上一个O_NONBLOCK参数

read会立即返回,当n<0时不break,打印read返回值和描述,轮询方式查看read状态

cerr << “read error,” << “error str:” << errno << “,” << strerror(errno) << endl;

在这里插入图片描述
没就绪时会以出错的方式返回,那怎么区分是真的出错了还是没有就绪,可以通过上面的错误码11判断,也就是宏EWOULDBLOCK

// 非阻塞,底层没有就绪,recv/read/write/send,返回值出错返回// 怎么区分 a.真的出错 b.底层没有就绪,通过errnoif (errno == EWOULDBLOCK){cout << "fd not ready, try again" << endl;// do other thing;}else{cerr << "read error," << "error str:" << errno << "," << strerror(errno) << endl;sleep(1);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VAD: 向量化场景表示,用于高效的自动驾驶

VAD: Vectorized Scene Representation for Efficient Autonomous Driving VAD: 向量化场景表示&#xff0c;用于高效的自动驾驶 https://github.com/hustvl/VAD Abstract Autonomous driving requires a comprehensive understanding of the surrounding environment for …

英语单词终极记忆

你应当知道一个专业术语&#xff0c;叫COCA。 这个单词很好记&#xff0c;但你可能记不住。 你应当这样记&#xff1a; 你记住了 可口可乐&#xff0c;也就记住了 coca &#xff08;谐音&#xff1a;可口&#xff09;。 从而记住了 COCA。 无论如何&#xff0c;你这辈子&…

react版本判断是否面包含

react-admin: react版本 import { useState,useEffect } from react import ./Secene.css import { Checkbox } from "antd"; import* as turf from turf/turf; import type { CheckboxProps } from antd; // const onChange: CheckboxProps[onChange] (e) >…

Spring Boot + Spring Batch + Quartz 整合定时批量任务

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 最近一周&#xff0c;被借调到其他部门&#xff0c;赶一个紧急需求&#xff0c;需求内容如下&#xff1a; PC网页触发一条设备升级记录&#xff08;下图&#xff09;&#xff0c;后台要定时批量设备更…

第15周 Zookeeper分布式锁与变种多级缓存

Zookeeper **************************************************************

Python客户端操作Elasticsearch

一.Python与Elasticsearch交互示例 这段代码是使用Python的elasticsearch模块与Elasticsearch进行交互的示例&#xff1a; from elasticsearch import Elasticsearch# 一.创建连接 # 建立到Elasticsearch的连接&#xff0c;指定主机和端口&#xff0c;设置请求超时时间为3600…

【C语言篇】C语言数据类型和变量

文章目录 C语言数据类型和变量1. 数据类型介绍1.1 字符型1.2 整形1.3 浮点型1.4 布尔类型1.5 各种类型数据长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof表达式不计算 2. signed和unsigned3. 数据类型的取值范围4. 变量4.1变量的创建4.2 变量的分类 5.强制类型转换 C语…

【C语言】【数据结构】二分查找(数组的练习)

目录 一、什么是二分查找 二、算法思想 2.1、概述 2.2、举例 &#xff08;1&#xff09;查找3&#xff08;数组里面存在的数&#xff09; &#xff08;2&#xff09;查找12&#xff08;数组里面不存在的数&#xff09; 三、代码实现 四、计算mid公式的优化 一、…

【03】Java虚拟机是如何加载Java类的

从class文件到内存中的类&#xff0c;按先后顺序需要经过加载、链接以及初始化三个步骤 一、加载 加载就是查找字节流&#xff0c;并且据此创建类的过程。 除了启动类加载器&#xff08;所有类加载器的祖师爷&#xff0c;由C实现&#xff0c;没有对应的Java对象&#xff09;之外…

大话成像公众号文章阅读学习(二)--- 下一代 AI-ISP会更好

系列文章目录 文章目录 系列文章目录前言一、AI-ISP1.1 定义与工作原理1.2 应用场景 二、展望总结 前言 这篇是 下一代 AI-ISP会更好 文章地址&#xff1a;https://mp.weixin.qq.com/s/N3YnkXF_stvP6k3jRTKCpQ 一、AI-ISP 1.1 定义与工作原理 定义&#xff1a;AI-ISP&#…

GEE:多面板同步缩放查看多源数据,并实现交互选点构建NDVI曲线

一. 目标 ①构建三个面板&#xff0c;分别显示不同来源数据&#xff1b; ②面板1显示哨兵数据面版2显示谷歌高清数据面板3实现用户任意交互选点&#xff0c;并以该点为中心构建正方形&#xff0c;随后生成该正方形的区域NDVI平均值长时序曲线&#xff1b; ③保证前两个面板可…

19.延迟队列优化

问题 前面所讲的延迟队列有一个不足之处&#xff0c;比如现在有一个需求需要延迟半个小时的消息&#xff0c;那么就只有添加一个新的队列。那就意味着&#xff0c;每新增一个不同时间需求&#xff0c;就会新创建一个队列。 解决方案 应该讲消息的时间不要跟队列绑定&#xf…

27、美国国家冰雪中心(NSIDC)海冰密集度月数据下载与处理

文章目录 一、前言二、数据下载三、使用Ponply查看数据结构四、代码一、前言 处理美国国家冰雪中心(NSIDC)的海冰密集度月度数据时,坐标转换是一个重要的步骤。NSIDC提供的数据通常采用极地球面坐标系,需要将其转换为常用的地理坐标系(如经纬度)以便进行分析和可视化。 坐…

python debug怎么用

1.打开pycharm&#xff0c;新建一个python程序&#xff0c;命名为excel.py。 2.直接贴出代码&#xff0c;如果是hello world就不存调试的问题了&#xff01; 3.介绍调试的菜单操作&#xff0c;在【菜单栏】选择【RUN】&#xff0c;下拉菜单里选择【debug excel.py】或者【Debug…

【C++】类与对象--初始化列表,类型转换,static,友元

文章目录 前言一、初始化列表1.1 初始化列表概述1.2 初始化列表注意事项初始化列表代码示例 二、类类型转换2.1 类类型转换2.2 代码示例 三.static成员3.1 静态成员变量3.2 代码示例 四.友元4.1友元概述4.2 友元特点4.3 友元代码示例 五.内部类5.1 内部类特点5.2 代码示例 六.匿…

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了&#xff01;原来是咱们的大屏设计太酷&#xff0c;吓着前端开发老铁了 艾斯视觉观点认为&#xff1a;在软件开发的世界里&#xff0c;有时候创意和设计的火花会擦得特别亮&#xff0c;以至于让技术实现的伙伴们感到既兴奋又紧张。这不&#xff0c;我们的设计团队刚刚…

利用AI能力实现一个生成掘金、CSDN文章的总结并生成思维脑图

背景 为了快速了解文章重点&#xff01;&#xff01; 设计思路 1、根据文章链接、获取文章内容 2、编写 prompt 3、利用 markmap 显示思维导图 实现 获取文章内容 利用爬虫技术&#xff0c;简单利用 axios 获取链接内容&#xff0c;然后通过 cheerio 获取相关元素。 编码…

靶机Metasploitable2的安装

Metasploitable2是一款基于Ubuntu Linux的操作系统。Metasploitable2是一个虚拟机文件&#xff0c;从网上下载解压之后就可以直接使用&#xff0c;无需安装。该系统本身设计作为安全工具测试和演示常见漏洞攻击的靶机&#xff0c;所以它存在大量未打补丁漏洞&#xff0c;并且开…

C语言中的IO控制流

文章目录 一、什么是C语言中的IO控制流二、open函数 1.使用open函数创建文件2.使用使用open函数打开文件三、文件的权限四、文件的描述符五、read函数六、write函数七、lseek函数八、close函数 一、什么是C语言中的IO控制流 在linux系统中一切皆文件&#xff0c;C语言中的IO控…

13.2 MongoDB

13.2 MongoDB 1. 概述2. docker安装3. SpringBoot整合MongoDB3.1 依赖3.2 配置连接1. 基于`yml`配置2. 基于配置类配置3.3 启动项坑1坑23.4 新增业务1. 实体类映射2. 数据层3. 业务层4. 控制层5. 测试结果3.5 单条记录查询业务1. 数据层2. 业务层3. 控制层4. 断点测试3.6 分页查…