【问题标题】:Select (Linux) function always returns 0Select (Linux) 函数总是返回 0
【发布时间】:2011-08-27 22:28:36
【问题描述】:

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

【问题讨论】:

  • 但是函数 select() 的代码在哪里??
  • select 是 UNIX 系统中的系统调用
  • 你是如何获得fd的?你确定它有效吗?
  • 我相信如果使用无效的 fd 调用 select 会返回 -1。在这种情况下,我通常使用 strace 来查看实际情况。
  • 另外,您的问题标题和代码不匹配。你在哪里检查select返回的值是否为0。它可能是1,在这种情况下,这意味着有数据要读取。

标签: c linux function networking select-function


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 正在检查文件结尾'或类似条件',而不是有类似条件。如果有等待读取的 EOS,则 fd 将出现在 read_fds 集中,因此他不会看到 select 超时,他将进入他的 read() 调用,在那里他可以检测到它(noread == 0).
    • 好吧,我无法想象在普通文件上选择超时。
    • 更别提等待了。
    • 我不知道这是关于什么的。这些都没有意义。你问他为什么在他没有发布那部分代码时不检查 EOS。几乎可以肯定它不是一个“普通文件”而是一个套接字:套接字也有一个 EOS 条件,以及 select() 可能超时的条件。你似乎不知道 select() 是什么。
    • 现在这里 fd 是一个命名管道 fd ...我使用 mkfifo 调用 ...并且仅在读取模式下使用 open 打开管道 ...并且从日志中我检查了 fd 是一个阳性不..我的意思是一个有效的 fd .....
    猜你喜欢
    • 2012-12-02
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多