Select(Linux)函数始终返回0

时间:2011-05-18 10:16:05

标签: c linux function networking select-function

在我的情况下选择函数总是返回零,这是超时,这是连续发生的所以我的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);
}

2 个答案:

答案 0 :(得分:1)

你的逻辑没有意义。 errno仅在select()返回-1时才有意义。如果它返回零,则没有fds准备好,所以有一个超时,并且不需要测试其他任何东西。如果它返回一个正值,你需要循环并处理许多准备好的fd。

答案 1 :(得分:0)

为什么不检查文件结尾或类似情况?我相信你的描述符的EOF或其他特殊状态是完全匹配这种情况。

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

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

Tail utility source可能会帮助您实施文件监控代码。