非阻塞IO

套接口缺省是阻塞的。这一点意味着当发出一个不能立即完成的套接口调用时,其进程将被投入睡眠,等待响应操作完成。

1.输入操作:read、readv、recvfrom。

如果某个进程对一个阻塞的TCP套接口调用这些函数之一,而且该套接口的接收缓冲区中没有数据可读,该进程将投入睡眠,直到一些数据到达。既然TCP是字节流协议,该进程的唤醒就只需到达一些数据:这些数据可能是单个字节,也可以是一个完整的TCP分节中的数据。如果想等到某个固定数目的数据可读为止,那么可以调用我们的readn函数,或者指定MSG_WAITALL标志。UDP是数据报协议,如果一个阻塞的UDP套接口的接收缓冲区为空,对他调用输入函数的进程将睡眠,直到到达一个完整的UDP数据报。

对于非阻塞的套接口,如果输入操作不能被满足(TCP套接口即至少有一个字节的数据可读,对于UDP套接口即有一个完整的数据报可读),相应调用立即返回一个EWOULDBLOCK错误。


2.输出操作:write,writev,send,sendto等

对于TCP套接口,内核将从应用进程的缓冲区拷贝数据到套接口的发送缓冲区。对于阻塞的套接口,如果其发送缓冲区没有空间,进程将被投入睡眠,直至有空间为止。

对于一个非阻塞的TCP套接口,如果其发送缓冲区中根本没有空间,输出函数调用将立即返回一个EWOULDBLOCK错误。如果其发送缓冲区有一些空间,返回值将是内核能够拷贝到改缓冲区中的字节数。

UDP套接口不存在真正的发送缓冲区,内核只是拷贝应用进程数据并把它沿着协议栈向下传送,渐次冠以UDP头部和IP头部,因此对一个非阻塞UDP套接口,输出函数不会因与TCP套接口一样的原因阻塞,不过可能因其他原因阻塞。


3.accept

阻塞:无连接到达,进程睡眠

非阻塞:如果对一个非阻塞的套接口调用accept函数,并且尚无新的链接到达,accept调用将立即返回EWOULDBLOCK错误


4.connect

如果对一个非阻塞的TCP套接口调用connect,并且连接不能立即建立,那么连接的建立照样发起(譬如发送三次握手的第一个分组),不过返回一个EINPROGRESS错误。注意这个错误不同于上述三种情况的错误。另请注意有些连接可以立即建立,这主要发送在服务器和客户机在同一个机器的情况。因此对一个非阻塞的connect,我们也得预备connect成功返回情况发生。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值