首页 理论教育嵌入式系统应用:阻塞与非阻塞操作

嵌入式系统应用:阻塞与非阻塞操作

【摘要】:默认情况下,socket是工作在阻塞模式下的,也可修改为非阻塞工作模式。

默认情况下,socket是工作在阻塞模式下的,也可修改为非阻塞工作模式。

1.默认情况下对于TCP套接字使用w rite()/send()发送数据时

◆首先会检查缓冲区,如果缓冲区的可用空间长度小于要发送的数据,那么write()/send()会被阻塞(暂停执行),直到缓冲区中的数据被发送到目标机器,腾出足够的空间,才唤醒write()/send()函数继续写入数据;

◆如果TCP协议正在向网络发送数据,那么输出缓冲区会被锁定,不允许写入,write()/send()也会被阻塞,直到数据发送完毕缓冲区解锁,write()/send()才会被唤醒;

◆如果要写入的数据大于缓冲区的最大长度,那么将分批写入;

◆直到所有数据被写入缓冲区write()/send()才能返回。

2.默认情况下对于TCP套接字使用read()/recv()读取数据时

◆首先会检查缓冲区,如果缓冲区中有数据,那么就读取,否则函数会被阻塞,直到网络上有数据到来;(www.chuimin.cn)

◆如果要读取的数据长度小于缓冲区中的数据长度,那么就不能一次性将缓冲区中的所有数据读出,剩余数据将不断积压,直到有read()/recv()函数再次读取;

◆直到读取到数据后read()/recv()函数才会返回,否则就一直被阻塞。

3.修改非阻塞工作模式的方法

修改方法大致有两种方法,第一种方法就是直接利用方式、接收函数的参数,如下:

write(sockfd,buf,len,MSG_DONTWAIT);

其中MSG_DONTWAIT参数将使本次操作修改为非阻塞模式。

另一种方法是利用修改socket文件特性标志位完成,这里不再讲述。