zoukankan      html  css  js  c++  java
  • 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 发表评论
  • 相关阅读:
    分布式哈希和一致性哈希算法
    消息队列rabbitmq的五种工作模式(go语言版本)
    Mysql查询缓存
    数据库的三大设计范式
    二叉树的常见算法
    消息队列选型分析
    Mysql防止索引失效原则
    Mysql索引优化单表、两表、三表实践
    数据结构 【栈与队列】
    谷歌实用插件
  • 原文地址:https://www.cnblogs.com/cokecoffe/p/2537124.html
Copyright © 2011-2022 走看看