`
memorymyann
  • 浏览: 266324 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

21.非阻塞I/O

F# 
阅读更多

设置一个I/O成为非阻塞很简单,只需要:

int val = fcntl(sockfd, F_GETFL, 0);

fcntl(sockfd, F_SETFL, val | O_NONBLOCK);

 

第一步是获取描述字原来的属性。第2步是为描述字增加O_NONBLOCK(非阻塞)属性。

fcntl包含在头文件fcntl.h中,同时记得带上头文件unistd.h。

这样的设置会影响套接字读写,比如调用read时候,如果是非阻塞描述字,read不会等待,而会立即返回。但不会影响select函数,也就是说如果你把描述字放在select中,不管描述字是阻塞还是非阻塞的,select函数都会阻塞,当然要让select函数不阻塞很简单,只用在等待时间上设置即可。

 

在没有设置非阻塞I/O情况下,有下面几种函数调用会引起阻塞:

1.read系列:包括readv, recv, recvfrom, recvmsg。这些函数只要描述字中没有数据就会阻塞。(一般是这样,某些情况还要视具体设置而定)。

 

2.write系列:包括writev, send, sendto, sendmsg。

 

3.accept函数:如果已连接队列中没有连接,则会引起阻塞。

 

这3种如果设置了非阻塞,会立即返回,所以在返回要进行检查其返回值,鉴定是不是正确返回,还是因为非阻塞而导致的错误返回。

 

4.用于TCP的connect(不包括UDP的connect)。如果是阻塞情况,在三路握手完成之前,也就是说客户在接受到它的SYN的ACK之前是不会返回的。如果是设置成了非阻塞,则会立即返回,但并不表示三路握手没有成功,实际上三路握手还在进行。关于非阻塞的connect看下一篇。

分享到:
评论

相关推荐

    java阻塞i/o与非阻塞i/o控制

    java阻塞i/o与非阻塞i/o控制,使开发者编写更好的i/o程序

    后端开发 技术关键词: Node.js与Express框架 内容关键词: 事件驱动的非阻塞I/O

    内容关键词: 事件驱动的非阻塞I/O 用途: 用于构建高性能的服务器端应用程序,支持实时通信和高并发处理。 对资源的描述: Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得开发者可以使用JavaScript...

    同步异步阻塞非阻塞I/O思维导图

    同步异步,阻塞非阻塞,I/O学习总结的思维导图,需要结合Richard Stevens的书来学习

    linux 设备驱动中的阻塞与非阻塞 I/O

    linux 设备驱动开发详解,宋宝华,人民邮电出版社

    Node中对非阻塞I/O、事件循环的知识点总结

    单线程、非阻塞I/O、事件驱动,这三个特点是相辅相成的。 Node为了在低硬件服务器条件下高并发,所以减少了内存消耗,选择单线程; 因为只有一个线程,所以必须非阻塞I/O,每件事情都有回调函数; 为了合理调度,...

    详解socket阻塞与非阻塞,同步与异步、I/O模型

    主要介绍了详解socket阻塞与非阻塞,同步与异步、I/O模型,socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别,本文将详细讲诉。

    Java 非阻塞I/O使用方法

    主要介绍了Java 非阻塞I/O使用方法,文中涉及非阻塞I/O的简介,同时向大家展示了利用非阻塞I/O实现客户端的方法,需要的朋友可以参考下。

    Linux设备驱动中的阻塞和非阻塞I/O

    写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。  一、基本概念:  阻塞操作:是指在执行设备...

    深入浅出:Linux设备驱动中的阻塞和非阻塞I/O

    写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。  一、基本概念:  阻塞操作 : 是指在执行设备...

    网络编程高级应用 I/O阻塞与非阻塞操作应用

    I/O阻塞与非阻塞操作应用 socket多路复用技术socket信号驱动UDP广播与组播通信

    Java非阻塞I/O在乡村可视化远程医疗系统中的应用

    分析了乡村可视化远程医疗系统采用多线程技术实现网络通信存在的不足,阐述了Java非阻塞I/O的基本原理。系统采用非阻塞I/O通信技术只使用一个线程并行实现大量客户无阻塞的通信,有效地减少了系统开销,较好地提升了...

    coio-rs —具有可窃用调度程序的协程I / O库-Rust开发

    功能非阻塞I / O窃取协程的协程调度异步计算API用法注意:您必须使用Nightly Rust来构建此项目。 [dependencies.coio] git =“ https://github.com/zonyitoo/coio-rs.git”基本协同程序外部包装箱coio; 使用coio ::...

    ReactPHP:使用 PHP 的事件驱动、非阻塞 I/O-开源

    它的事件驱动架构使其非常适合处理成百上千个并发连接、长时间运行的应用程序和许多其他形式的具有非阻塞 I/O 操作的协作多任务处理的高效网络服务器和客户端。 ReactPHP 的特别之处在于其生动的生态系统,其中包含...

    java i/o 开发框架mina

    java开发非阻塞i/o很好用的框架,简单便利,这个是稳定版1.1.7

    阻塞与非阻塞IO

    阻塞和非阻塞I/O在设备驱动中的应用 目标 理解阻塞、非阻塞、轮询三种I/O模型 掌握阻塞I/O在驱动程序中的使用 掌握驱动和应用程序中的轮询编程 第一章:阻塞型I/O 第二章:轮询操作(I/O复用) 第三章:三种I/O模型...

    15章基于C++从0到1手写Linux高性能网络编程框架

    非阻塞 I/O 执行的系统调用总是立即返回,不管事件是否已经发生。如果事件没有立即发生,这些系统调用返回 -1,然后设置 errno,应用程序需要根据返回的 errno 进行相应的处理。 I/O 复用 I/O 复用是指,应用程序...

    openresty-1.15.8.1-win64.zip

    OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能...

    socket网络通信(重叠I/O方式实现)包含4种方式

    采用重叠I/O方式实现的socket网络编程,异步非阻塞方式,代码效率比阻塞式的socket编程方式高。实现了TCP server,TCP client,UDP server,UDP client,四种方式可选,可以使用在各种场合用于监控网络数据。本程序...

Global site tag (gtag.js) - Google Analytics