厚积薄发,滴水穿石

搬家到主站了:http://www.cnblogs.com/cokecoffe/
随笔 - 45, 文章 - 8, 评论 - 12, 引用 - 0
数据加载中……

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;
        }
}

posted on 2011-08-01 17:25 Wangkeke 阅读(490) 评论(0)  编辑 收藏 引用 所属分类: APUE


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理