在使用poll系统调用时,我发现了一个stange行为。
我有以下代码片段。
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的设置。
有人能帮忙吗?
最佳答案
此测试不正确:
if(myPollfds[i].revents == POLLIN)
它可能(不能确定,因为您删除了所有逻辑)是:
if((myPollfds[i].revents & POLLIN) != 0)
另外,看到“polling failed”消息也是非常正常的。这只意味着在那个特定的文件描述符上没有活动。你在多个描述符上进行轮询,对吧?所以有些人没有活动是正常的。
关于c++ - Linux中轮询系统调用的不正确行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17062597/