设置一个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看下一篇。
分享到:
相关推荐
对于高效的系统设计,理解并掌握阻塞I/O和非阻塞I/O是非常重要的。这两种I/O模型在处理数据传输时有着显著的区别,对程序性能和并发性有着深远的影响。 **阻塞I/O(Blocking I/O)** 阻塞I/O模型是最常见的I/O模式...
然而,使用非阻塞I/O需要应用层代码进行复杂的轮询检查,以确定数据是否已准备好,这可能导致CPU资源的过度消耗。 在Linux设备驱动中,通常需要根据具体应用场景选择合适的I/O模型。例如,对于实时性要求高的系统,...
内容关键词: 事件驱动的非阻塞I/O 用途: 用于构建高性能的服务器端应用程序,支持实时通信和高并发处理。 对资源的描述: Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得开发者可以使用JavaScript...
2. **非阻塞I/O(Non-blocking I/O)** 在非阻塞模式下,read或write调用不会挂起进程,而是立即返回一个错误代码。程序员需要自己处理数据未准备好的情况,通常使用循环来检查。 3. **I/O复用(I/O Multiplexing...
### 线程之舞:JavaScript的单线程与非阻塞I/O揭秘 #### JavaScript简介及主要特点 JavaScript(通常简称为JS)是一种高级、解释型的编程语言,广泛应用于构建交互式的Web应用程序。随着时间的推移,JavaScript已...
常见的I/O模型有阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O以及异步I/O。在WINSOCK中,这些模型都被支持,并且可以根据应用场景选择合适的模型。 1. **阻塞I/O**:这是最基本的模型,当一个套接字进行读写操作...
非阻塞I/O意味着即使没有数据可读,读取操作也不会挂起;事件驱动则是通过事件回调机制,当某个I/O操作完成时,系统会通知相应的处理函数。这种模型非常适合网络服务、数据库连接等需要频繁进行I/O操作的场景。 在...
同步异步,阻塞非阻塞,I/O学习总结的思维导图,需要结合Richard Stevens的书来学习
根据I/O模型的不同,可以将它们分为两大类:阻塞I/O和非阻塞I/O。这两种I/O模型对于系统的性能有着显著的影响,本文将深入探讨它们的原理、应用场景以及优缺点。 #### 二、阻塞I/O模型 ##### 2.1 定义 阻塞I/O是一...
文章首先介绍了非阻塞I/O的基本概念及其在Windows系统中的应用,并通过比较不同类型的非阻塞I/O编程模式,阐述了各自的优缺点及适用场景。 #### 非阻塞I/O的概念 在传统的阻塞I/O模型中,当应用程序发起一个I/O...
而Node.js推崇的是非阻塞I/O模型,通过事件驱动和回调函数实现异步操作,以提高系统的并发能力。 总结来说,同步与异步是关于处理结果获取方式的不同策略,而阻塞与非阻塞是关于处理过程中线程状态管理的差异。在...
5. **非阻塞I/O** 在传统的I/O模型中,读写操作通常是阻塞的,即在等待数据准备好或完成写入时,线程会被挂起。而在NIO中,通道和缓冲区支持非阻塞模式,当数据未准备好时,读写操作不会阻塞,而是立即返回,允许...
而非阻塞I/O操作则允许CPU在I/O操作未完成时继续执行其他任务,通过轮询方式来检查I/O操作是否完成。轮询技术有read、select、poll、epoll等,其中epoll是Linux下效率最高的I/O事件通知机制。 理想与现实中的异步I/...
Unix I/O系统是操作系统的核心部分,它提供了对文件和设备进行输入输出操作的接口。本文主要总结了Unix下的I/O模型及其相关系统调用。 在Unix中,每个进程都有一个打开文件描述符表,用于存储指向文件inode的指针和...
非阻塞I/O不会挂起,即使数据未准备好也会立即返回,但可能会多次调用才能完成I/O操作。 二、I/O层次结构 1. 用户空间I/O:应用程序直接与硬件交互,效率高但可能导致系统崩溃,因此通常不推荐。 2. 系统调用I/O...
而非阻塞I/O则允许进程在没有数据可读时立即返回,通常会设置errno为"EAGAIN"来表示尝试读取时没有数据。非阻塞模式适用于需要快速响应或者避免单一任务阻塞整个进程的场景。 在Linux中,非阻塞I/O处理可以通过设置...
Unix系统提供了多种I/O模型,如阻塞I/O、非阻塞I/O、I/O多路复用(如select、poll、epoll)、信号驱动I/O以及异步I/O。I/O聚集通常指的是在一个系统调用中处理多个文件描述符,而I/O分离则是在不同时间或通过不同...
2. 同步非阻塞I/O模型:在这种模型中,read或write操作会立即返回,即使数据未准备好,但需要不断地轮询检查数据是否就绪。 3. I/O复用模型(如select、poll、epoll):允许单个线程监视多个文件描述符,等待数据...
本文将深入探讨五种主要的套接字I/O模型:阻塞I/O、非阻塞I/O、I/O复用(select/poll/epoll)、信号驱动I/O以及异步I/O,同时通过提供的源代码文件,我们可以更直观地理解这些模型的工作原理。 1. **阻塞I/O模型**...
3. **非阻塞I/O(NIO)**:Java NIO在Java 1.4引入,提供了异步I/O操作,可以处理多个连接,而无需为每个连接创建一个新的线程。关键类有Selector、Channel和Buffer,Selector可以监控多个通道的事件,Channel代表I/...