2013-06-12 43 views
0

使用poll系统调用时,我发现一个stange行为。 我有以下代码片段。在Linux中调查系统调用的错误行为

struct pollfd myPollfds[nCount]; 
ACE_Time_Value selectTime; 
selectTime.set(60); 

myPollfds[0].fd = rtrrmEvent[0]; 
myPollfds[0].events = POLLIN | POLLRDHUP | POLLHUP | POLLERR; 
     myPollfds[0].revents = 0; 

     myPollfds[1].fd = rtrfeEvent[0]; 
     myPollfds[1].events = POLLIN | POLLRDHUP | POLLHUP | POLLERR; 
     myPollfds[1].revents = 0; 

     myPollfds[2].fd = _h[msclient_pos]; 
     myPollfds[2].events = POLLIN | POLLRDHUP | POLLHUP | POLLERR; 
     myPollfds[2].revents = 0; 

     myPollfds[3].fd = holdTimeEvent[0]; 
     myPollfds[3].events = POLLIN | POLLRDHUP | POLLHUP | POLLERR; 
     myPollfds[3].revents = 0; 

     ACE_Time_Value sleepTime(0,20000); 
     while(isRunning() && !_stopRequested) 
     { 
       ACE_OS::sleep(sleepTime); 
       for(int i = 0; i < 4; i++) 
         myPollfds[i].revents = 0; 
       waitResult = ACE_OS::poll (myPollfds, nCount, &selectTime); 
       if(waitResult == -1) // poll failed 
       { 
         DEBUG("%s", "poll failed"); 
         continue; 
       } 
       else if(waitResult == 0) // Time out 
       { 
         //Do something . 
       } 
       char nodata[256]; 

       for(short i = 0; i < nCount; i++) 
    if(myPollfds[i].revents == POLLIN) 
         { 
           if(i == rtrrm_pos) 
           { 
             // Stop channel 
           } 
           else if(i == rtrfe_pos) // 'rtrfe' command 
           { 
             DEBUG("%s", "fe issued"); 

           } 
           else if(i == msclient_pos || waitResult == 0) 
           { 
             //Do something 
           } 
           else if(i == holdTime_pos) 
           { 
             DEBUG("%s", "Hold issued"); 
           } 
         } 
         else 
         { 
           DEBUG("polling failed with with myPollfds[i].revents == %d",myPollfds[i].revents); 
         } 

的问题是,我得到一些时间: “轮询失败与myPollfds [I] .revents == 0” : “轮询失败与myPollfds [I] .revents == 8193”

民意调查并未等待fd的设定。 任何人都可以帮忙吗?

+0

-1 for blaming linux。 –

+0

我不是在责怪Linux,我很气急地知道我在做什么错..多数民众赞成它 – samairtimer

回答

2

这个测试是不正确的:

if(myPollfds[i].revents == POLLIN) 

它也许应该(可能不是因为你删除了所有的逻辑可以肯定的)是:

if((myPollfds[i].revents & POLLIN) != 0) 

而且,看到“轮询失败”消息是完全正常的。这只是表示在该特定文件描述符上没有任何活动。您正在轮询多个描述符,对吗?所以有些人没有活动是正常的。

+0

好吧我明白你在说什么,但事情是,即使没有活动正在进行,它应该击中等待超时部分码。但我从来没有观察到这一点,如果(waitResult == 0)//超时 { //做些什么。 } – samairtimer

+0

@samairtimer当没有活动时会发生什么? –

+0

当没有活动..我得到myPollfds [i] .revents = 8193某些值,这不等于POLLIN,因此逻辑不确定。 – samairtimer

0

正如大卫说,

“查询失败” 的消息是完全正常的。

在任何情况下

,当poll返回不仅仅是POLLIN 例如其他:

poll ... = 1 



{fd=8193, revents=POLLIN|**POLLHUP**} 
if (POLLIN|POLLHUP == POLLIN) 

是进入 “其他” 的条款。

我不擅长C语言,所以我不知道David的“if语句”是否正确。