linux socket非阻塞编程时常见到如下的code:
socket s;
.....
fd_set set;
.....
struct timeval tv;
while(1)
{
FD_ZERO(&set);//将你的套节字集合清空
FD_SET(s, &set);//加入你感兴趣的套节字到集合,这里是一个读数据的套节字s
tv.tv_sec = 3;
tv.tv_usec = 0;
select(maxfd+1,NULL,&set,NULL,&tv);//检查套节字是否可读,
//很多情况下就是是否有数据(注意,只是说很多情况)
//这里select是否出错没有写
// timeout 时间为3s
if(FD_ISSET(s, &set) //检查s是否在这个集合里面,
{ //select将更新这个集合,把其中不可读的套节字去掉
//只保留符合条件的套节字在这个集合里面
recv(s,...);
}
//do something here
}
(1)FD_ZERO(&set);则set用位表示是0000,0000。
(2)若fd=5,执行FD_SET(fd,&set);后set变为0001,0000(第5位置为1)
(3)若再加入fd=2,fd=1,则set变为0001,0011
(4)执行select(6,0,&set,0,&tv)阻塞等待
(5)若fd=5发生可读事件,则select返回,此时set变为0000,0011。注意:没有事件发生的fd=5被清空。