首先先说一下,阻塞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相关推荐

  1. 分不清楚阻塞IO,非阻塞IO,IO复用?用最贴近生活的例子带你理解这三者的区别!

    文章目录 前言 一.什么是IO 二.阻塞IO模型 三.非阻塞 IO模型 四.IO复用模型 总结 前言 在<Unix网络编程>一书中提到了五种IO模型,分别是:阻塞IO.非阻塞IO.IO复用 ...

  2. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...

  3. 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

    5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...

  4. IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    文章目录 IO模型 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用IO五类. 最主要的两 ...

  5. 5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

    5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境.本文是在<UNIX网络编程 ...

  6. 阻塞io阻塞io_Redis:RESP协议,阻塞IO 与非阻塞IO,Redis的线程模型

    1.Redis 阻塞IO 与非阻塞IO Java在JDK1.4 中引入了NIO ,但是也有很多人在使用阻塞IO,这两种IO有什么区别? 在阻塞模式下,如果你从数据流读取不到指定大小的数据量,IO就会阻 ...

  7. Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程

    Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...

  8. 异步就是异步,根本就没有 异步非阻塞IO这个说法。阻塞 非阻塞,同步I/O 异步I/O 的区别

    先给大家安利一下这个 https://www.ibm.com/developerworks/cn/linux/l-async/ 里面关于 异步非阻塞IO 是错的. 异步就是异步,别扯 异步阻塞 异步非 ...

  9. IO复用\阻塞IO\非阻塞IO\同步IO\异步IO

    本文是对<UNIX网络编程卷1>第6章的总结. 一.            什么是IO复用? 它是内核提供的一种同时监控多个文件描述符状态改变的一种能力:例如当进程需要操作多个IO相关描述 ...

  10. AIO,BIO,NIO:同步阻塞式IO,同步非阻塞IO,异步非阻塞IO

    BIO,同步阻塞式IO,简单理解:一个连接一个线程 NIO,同步非阻塞IO,简单理解:一个请求一个线程 AIO,异步非阻塞IO,简单理解:一个有效请求一个线程 IO:阻塞IO BIO:同步阻塞IO.服 ...

最新文章

  1. maven详解之生命周期与插件
  2. c++读取json文件_SPARK入门 - json文件读取
  3. C2146和C4430错误:循环引用错误
  4. # 20175213 2018-2019-2 《Java程序设计》第1周学习总结
  5. android view存储为jpg,Android长按imageview把图片保存到本地的实例代码
  6. 组策略 之 恢复默认组策略对象命令
  7. 计算机类学生综合素质论文,【计算机教学论文】计算机教学中培养学生综合素质的探讨(共2338字)...
  8. Android笔记 定义意图过滤器intent- filter demo
  9. 回应UE4 Unity将很快让开发者在虚拟现实里构建虚拟现实
  10. 限流算法-令牌桶算法
  11. 如何利用图像识别、语音识别、文本挖掘做好鉴黄?
  12. visio2013里画带箭头的折线连接线
  13. LVM 的自定义报告(pvs vgs lvs各参数详解)
  14. 《Wasserstein GAN》继续 GAN
  15. 苹果cms模板_为什么选择苹果CMS?
  16. 关键词单数和复数,ASO排名差距居然这么大
  17. 交换机与路由器的对比,秒懂!!
  18. python int()函数详解
  19. Delphi 11.2 安装 CnWizards 组件包
  20. 在加权异构图上的基于元路径个性化推荐——SemRec

热门文章

  1. Linux学习笔记(五):less|more的命令使用
  2. 秒懂文件路径 ‘/‘ , ‘./‘ , ‘../‘ 的区别
  3. Flutter 常见问题总结
  4. Futter基础第14篇: 中的按钮组件 RaisedButton、FlatButton、OutlineButton、IconButton、ButtonBar以及自定义按钮组件
  5. Linux的tasklet函数详解
  6. linux中LCD之framebuffer设备驱动
  7. Django模板语言(DTL)
  8. vector.resize 与 vector.reserve的区别(转载)
  9. activemq spring 集成与测试
  10. 监控mysql的存储引擎