Codejie's C++ Space

Using C++

更正:被select()搞死


    CmdChannel昨天移植到Ubuntu上,功能都OK,就是发现CPU有点不对,怎么一直在90%的使用率呢?但为什么在Windows下运行是正常的呢?
    struct timeval val;
    fd_set rd;
    
int maxfd = -1;
    
int ret = 1;

    val.tv_sec 
= 0;
    val.tv_usec 
= 1000;

    cc_Global.telnet.run 
= 1;
    
while(cc_Global.telnet.run)
    
{
        maxfd 
= cc_TelnetServer_SetFd(&rd);  

        ret 
= select(maxfd + 1&rd, NULL, NULL, &val);

        
if(ret > 0)

    想来是select的问题,因为select本来就是放置100%CPU的。对着帮助文档,先检查maxfd,没错啊,再检查rd,然后是timeval,也没有错啊~是timeval设定的太短?换成val.sec = 5,问题依旧~
    折腾很久,突然发现,while循环在第一次运行时是有间隔的,但其后就开始100%了。突然想起,使用select的一个注意事项就是fdset每次要重新设置,因为select函数会修改其值。那么timeval也是如此吗?于是修改代码:
    struct timeval val;
    fd_set rd;
    
int maxfd = -1;
    
int ret = 1;

    cc_Global.telnet.run 
= 1;
    
while(cc_Global.telnet.run)
    
{
        maxfd 
= cc_TelnetServer_SetFd(&rd);  

        val.tv_sec 
= 0;
        val.tv_usec 
= 1000;

        ret 
= select(maxfd + 1&rd, NULL, NULL, &val);

        
if(ret > 0)
        

    果然如此,timeval被select函数清零了~
    查看select函数的原型:
     int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
    其timeout确实不是一个const量。。。

    windows和unix下的函数间的微小差异害死人啊~

posted on 2009-12-24 11:30 codejie 阅读(374) 评论(0)  编辑 收藏 引用 所属分类: C++


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


公告

Using C++

导航

统计

留言簿(73)

随笔分类(513)

积分与排名

最新评论

阅读排行榜

评论排行榜