在我的情况下选择函数总是返回零,这是超时,这是连续发生的所以我的CPU使用率也高达98%我的进程。我也尝试设置NULL而不是设置一些超时值,仍然返回零。我还用poll函数替换select。民意调查也出现了同样的问题。
这是我的代码的一部分;
while(1)
{
value = 0;
selectTimeOut = 0;
memset(buf,0,SIZE);
FD_ZERO(&read_fds);
FD_SET(fd, &read_fds);
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 1000;
fdmax = fd;
//using select to reduce cpu utilization
selectret = select(fdmax + 1,&read_fds,NULL,NULL,&tv);
if (selectret == -1)
{
print_sync("/home/fes/syclogs.txt","Select fails");
exit(0);
}
else
{
print_sync("/home/fes/syclogs.txt","Error set is %s",strerror(errno));
if(!FD_ISSET(fd, &read_fds))
{
print_sync("/home/fes/syclogs.txt","Select Time Out");
selectTimeOut = 1;
}
}
if(selectTimeOut == 1)
continue;
noread = read(fd,buf,SIZE);
}
答案 0 :(得分:1)
你的逻辑没有意义。 errno
仅在select()返回-1时才有意义。如果它返回零,则没有fds准备好,所以有一个超时,并且不需要测试其他任何东西。如果它返回一个正值,你需要循环并处理许多准备好的fd。
答案 1 :(得分:0)
为什么不检查文件结尾或类似情况?我相信你的描述符的EOF或其他特殊状态是完全匹配这种情况。
您应该进一步描述描述符和上下文。 fd来自哪里?它代表什么数据源?
查看调试消息,可能会得出结论,您正在尝试监视常规文件的更改。我不认为select可以帮助完成这项任务。
Tail utility source可能会帮助您实施文件监控代码。