3

在我的情况下,选择函数总是返回零,这是超时,并且这种情况不断发生,因此我的进程的 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);
}
4

2 回答 2

1

你的逻辑没有道理。errno只有当 select() 返回 -1 时才有意义。如果它返回零,则表示没有准备好 fds,因此存在超时,无需测试任何其他内容。如果它返回一个正值,您需要循环和处理那么多准备好的 fd。

于 2011-05-19T10:33:14.643 回答
0

为什么不检查文件结尾或类似情况?我相信 EOF 或描述符的其他异常状态非常适合这种情况。

您可能应该进一步描述描述符和上下文。fd 是从哪里来的?它代表什么数据源?

查看您的调试消息可能会得出结论,您正在尝试监视通常文件的更改。我不认为 select 可以帮助完成这项任务。

Tail 实用程序源代码可能会帮助您实现文件监控代码。

于 2011-05-18T10:39:46.693 回答