Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13574
  • 博文数量: 3
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-02 16:30
文章分类
文章存档

2011年(2)

2009年(1)

我的朋友

分类: LINUX

2011-06-15 01:02:17



(1). select方法

select(FD_SETSIZE, &rdfds, &wrfds, &epfds, &to);函数需要注意的地方
a. rdfds,wrfds,epfds 这些包含需要监视文件描述符的参数要使用临时的,值等于设置好的fd_set变量,因为select函数执行完会改变这个值,所以直接传的话就每次执行都要先使用FD_SET,FD_CLR这样的宏来设置.如下面代码中的"testfds = m_stParam.rdfds;",在这个代码的m_stParam.rdfds中监视了串口描述符,还有一个tcp或多个tcp和一个udp或多个udp描述符.用于串口控制程序,udp/tcp连接到地图服务器,更新和获取信息.


    while(true)
    {
        testfds = m_stParam.rdfds;
        
        if(m_stParam.timeout == 0){
            rc = select(FD_SETSIZE, &testfds, NULL, NULL, NULL);
        }else{
            struct timeval to;
            
            to.tv_sec = m_stParam.timeout / 1000;
            to.tv_usec = m_stParam.timeout % 1000 * 1000;
            
            rc = select(FD_SETSIZE, &testfds, NULL, NULL, &to);
        }
        
        if(rc == -1){
            print_per("select() error : ");
            ;//select error

        }
        else if(rc == 0){


b. 当select正确返回,获取是那个或那几个文件描述符导致函数返回时为了节省时间,for循环查询时只需要从fd=3开始查,查到fd < maxfd + 1.因为0:stdin;1:stdout;2:stderr,这三个一般都不监测,maxfd值为fd_set中设置的文件描述符的最大值.
c. 同样select函数的第一个参数也可以传maxfd+1, 而不用传FD_SETSIZE从而节省时间



(2). poll
(3). epoll
(4).





阅读(290) | 评论(0) | 转发(0) |
0

上一篇:linux和windows通用精确延时函数msleep

下一篇:没有了

给主人留下些什么吧!~~