Linux IO模型漫谈(4)- 非阻塞IO
首先先说一下,阻塞IO会在哪些地方阻塞住呢?输入操作read, 输出操作write,接受请求操作accept,发送请求操作connect,这四个地方阻塞进程。
非阻塞IO的模型图示在前面的章节有讲过,它和阻塞IO的最大区别就是:如果连接或者操作不能立即建立,那么连接的建立照样能发起,只是会返回一个错误信息。
同样,先说明几个用到的函数和操作:
1 fcntl函数
其全名为”file control“。顾名思义,fcntl可以执行各种操作符控制操作。
#include <fcntl.h>int fcntl(int fd, int cmd, .. /* int arg */)
第一个参数fd是文件描述符
第二个参数cmd是操作命令,比如设置套接字阻塞非阻塞的命令为F_SETFL, 设置套接字属主的命令为F_SETOWN
第三个参数以后,是操作命令的参数。比如设置非阻塞IO型的F_SETFL的参数为O_NONBLOCK
所以设置非阻塞IO的典型设置代码为:
flags = flags | O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
2 非阻塞IO返回的错误
对于不能满足的非阻塞IO操作,System V会返回EAGAIN错误,而源自Berkeley的实现返回EWOULDBLOCK。大多数当前系统把这两个错误码定义为相同的值。
对不能满足的非阻塞IO连接,系统会返回EINPROGRESS
按照非阻塞的定义,我们只需要将cli做下面修改:
3客户端代码
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>int main(int argc, char* argv[])
{int socketfd, n;socketfd = socket(AF_INET, SOCK_STREAM, 0);fcntl(socketfd, F_SETFL, O_NONBLOCK);struct sockaddr_in serv_addr;bzero((char *)&serv_addr, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(7777);for(;;) {if(n = connect(socketfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {if(errno == EINPROGRESS) {printf("EINPROGRESS\n");}} else {break;}}write(socketfd, "client message", 14);char buffer[256];bzero(buffer, 256);read(socketfd, buffer, 255);printf("server return message:%s\r\n", buffer);return 0;}
运行方式:
1 server不启动
2 client启动,则会在connect这个地方进入无限循环。
好吧,是不是觉得有问题?
1 这种模型,客户端使用轮询不断调用IO操作,那么,CPU就会一直用于轮询,造成cpu的浪费。
2 这种模型,代码量比阻塞的模型大很多
所以这个模型实际上是很少使用的。
Linux IO模型漫谈(4)- 非阻塞IO相关推荐
- 分不清楚阻塞IO,非阻塞IO,IO复用?用最贴近生活的例子带你理解这三者的区别!
文章目录 前言 一.什么是IO 二.阻塞IO模型 三.非阻塞 IO模型 四.IO复用模型 总结 前言 在<Unix网络编程>一书中提到了五种IO模型,分别是:阻塞IO.非阻塞IO.IO复用 ...
- Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...
- 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...
- IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
文章目录 IO模型 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用IO五类. 最主要的两 ...
- 5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境.本文是在<UNIX网络编程 ...
- 阻塞io阻塞io_Redis:RESP协议,阻塞IO 与非阻塞IO,Redis的线程模型
1.Redis 阻塞IO 与非阻塞IO Java在JDK1.4 中引入了NIO ,但是也有很多人在使用阻塞IO,这两种IO有什么区别? 在阻塞模式下,如果你从数据流读取不到指定大小的数据量,IO就会阻 ...
- Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程
Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...
- 异步就是异步,根本就没有 异步非阻塞IO这个说法。阻塞 非阻塞,同步I/O 异步I/O 的区别
先给大家安利一下这个 https://www.ibm.com/developerworks/cn/linux/l-async/ 里面关于 异步非阻塞IO 是错的. 异步就是异步,别扯 异步阻塞 异步非 ...
- IO复用\阻塞IO\非阻塞IO\同步IO\异步IO
本文是对<UNIX网络编程卷1>第6章的总结. 一. 什么是IO复用? 它是内核提供的一种同时监控多个文件描述符状态改变的一种能力:例如当进程需要操作多个IO相关描述 ...
- AIO,BIO,NIO:同步阻塞式IO,同步非阻塞IO,异步非阻塞IO
BIO,同步阻塞式IO,简单理解:一个连接一个线程 NIO,同步非阻塞IO,简单理解:一个请求一个线程 AIO,异步非阻塞IO,简单理解:一个有效请求一个线程 IO:阻塞IO BIO:同步阻塞IO.服 ...
最新文章
- maven详解之生命周期与插件
- c++读取json文件_SPARK入门 - json文件读取
- C2146和C4430错误:循环引用错误
- # 20175213 2018-2019-2 《Java程序设计》第1周学习总结
- android view存储为jpg,Android长按imageview把图片保存到本地的实例代码
- 组策略 之 恢复默认组策略对象命令
- 计算机类学生综合素质论文,【计算机教学论文】计算机教学中培养学生综合素质的探讨(共2338字)...
- Android笔记 定义意图过滤器intent- filter demo
- 回应UE4 Unity将很快让开发者在虚拟现实里构建虚拟现实
- 限流算法-令牌桶算法
- 如何利用图像识别、语音识别、文本挖掘做好鉴黄?
- visio2013里画带箭头的折线连接线
- LVM 的自定义报告(pvs vgs lvs各参数详解)
- 《Wasserstein GAN》继续 GAN
- 苹果cms模板_为什么选择苹果CMS?
- 关键词单数和复数,ASO排名差距居然这么大
- 交换机与路由器的对比,秒懂!!
- python int()函数详解
- Delphi 11.2 安装 CnWizards 组件包
- 在加权异构图上的基于元路径个性化推荐——SemRec
热门文章
- Linux学习笔记(五):less|more的命令使用
- 秒懂文件路径 ‘/‘ , ‘./‘ , ‘../‘ 的区别
- Flutter 常见问题总结
- Futter基础第14篇: 中的按钮组件 RaisedButton、FlatButton、OutlineButton、IconButton、ButtonBar以及自定义按钮组件
- Linux的tasklet函数详解
- linux中LCD之framebuffer设备驱动
- Django模板语言(DTL)
- vector.resize 与 vector.reserve的区别(转载)
- activemq spring 集成与测试
- 监控mysql的存储引擎