使用轮询系统调用时,我发现了一种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设定。 任何人都可以帮忙吗?
答案 0 :(得分:3)
此测试不正确:
if(myPollfds[i].revents == POLLIN)
它可能(不能确定,因为你删除了所有的逻辑)是:
if((myPollfds[i].revents & POLLIN) != 0)
此外,看到“轮询失败”消息是完全正常的。它只是意味着该特定文件描述符上没有活动。您正在轮询多个描述符,对吧?所以他们中的一些人没有活动是正常的。
答案 1 :(得分:0)
大卫说,
&#34;投票失败&#34;消息是完全正常的。
在任何情况下,轮询返回的不仅仅是POLLIN 例如:
poll ... = 1
{fd=8193, revents=POLLIN|**POLLHUP**}
if (POLLIN|POLLHUP == POLLIN)
进入&#34;否则&#34;子句。
我在C中表现不佳,所以我无法判断David是否&#34; if statement&#34;是否正确。