select

      FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 
      FD_SET(int fd, fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。 
      FD_CLR(int fd, fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。 
      FD_ISSET(int fd, fd_set *fdset);用于测试指定的文件描述符是否在该集合中。    

while(1)    
{        
       FD_ZERO(&set);//将你的套节字集合清空    
       FD_SET(s,    &set);//加入你感兴趣的套节字到集合,这里是一个读数据的套节字s    
       select(0,&set,NULL,NULL,NULL);//检查套节字是否可读,    
                                                    //很多情况下就是是否有数据(注意,只是说很多情况)  
                                                         //这里select是否出错没有写    
       if(FD_ISSET(s,    &set)    //检查s是否在这个集合里面,    
       {                                    //select将更新这个集合,把其中不可读的套节字去掉    
                                           //只保留符合条件的套节字在这个集合里面                           
               recv(s,...);    
       }    
       //do    something    here    
}

   如何唤醒堵塞在select上的操作:

1)  有数据可读/写,或出现异常。

2)  阻塞时间到,即time out

3)  收到一个non-block的信号。可由killpthread_kill发出。

当向一个select中增加描述符是如果此时select是堵塞的,是否应该立即唤醒?

你可能感兴趣的:(select)