Select的使用

首先解释几个名词
阻塞|非阻塞、同步|异步
同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制.也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者
阻塞和非阻塞,这两个概念与程序等待消息(无所谓同步或者异步)时的状态有关。
同步/异步与阻塞/非阻塞是两组不同的概念,它们可以共存组合。
Select
函数原型:

int select(int maxfdp,//所有文件描述符的最大值加1
          fd_set *readfds,//关注的可读描述符集
          fd_set *writefds,//关注的可写描述符集                                 
          fd_set *errorfds,//要关注的异常描述符集              
          struct timeval *timeout//超时时间
           ); 
//从触摸屏读取数据
int ReadFunc(int fd, char *buf, int len)
{
        fd_set fset;
        
struct timeval tv;
        
int rval;

        FD_ZERO(
&fset);
        FD_SET(fd, 
&fset);
        tv.tv_sec 
= 1;
        tv.tv_usec 
= 0;
        
int pos = 0;
        
int ret = 0;

        
while(1){
                
if ((rval = select( fd+1&fset, NULL, NULL, &tv)) < 0)
                {
                        
if (errno == EINTR)
                                
continue;
                        
else
                                rval 
= 0;
                }
                
else if (rval)
                {
                        
if(FD_ISSET(fd, &fset)){
                                
if(len > 50){
                                        ret 
= read(fd, buf, len);
                                }
else{
                                        
while(len){
                                                ret 
= read(fd, buf+pos, len-ret);
                                                len 
-= ret;
                                                pos 
+= ret;
                                        }
                                }
                        }
                        
/*              if ( rval<0 && errno != ENODEV) */
                        
/*              {       perror("read"); */
                        
/*              } */
                }
                
return rval;
        }
}



Wangkeke 2011-08-01 17:25 发表评论

posted on 2011-08-01 17:25  cokecoffe  阅读(182)  评论(0编辑  收藏  举报

导航