【问题标题】:Select EBADF : which FD is bad?选择 EBADF:哪个 FD 不好?
【发布时间】:2009-05-19 14:57:51
【问题描述】:

我们的生产代码中有一个长期存在的错误。这本质上是一个基于套接字的守护进程。它使用 select 监听一堆文件描述符。

偶尔(大约一天一次),选择会返回 EBADF。

我已经编写了代码来搜索错误的文件描述符,它遍历每个 fd 并在其上调用 select。这些调用永远不会返回 EBADF。我也试过fstat。他们也从不返回 EBADF。

我还重写了守护进程以使用 poll。这没有帮助。

有人有其他想法吗? (除了我犯了一个愚蠢的错误,这很容易用 select 完成)。

【问题讨论】:

    标签: c linux


    【解决方案1】:

    我同意詹姆斯的观点。使用 poll(),您可以轻松检查每个 fd 的 revents。

    struct pollfd fds[NUM_FDS];
    int ret, i;
    
    ...
    
    ret = poll(fds, NUM_FDS, POLL_TIMEOUT);
    for (i = 0; i < NUM_FDS; i++)
      if (fds[i].revents & POLLHUP || fds[i].revents & POLLNVAL)
         ... do something ...
    

    当然你不会在现实世界中那样实现它,它只是一个例子。我很久以前就停止使用 select(),poll() 是一个更好的接口。你是对的,用 select() 太容易把自己踢到脚上。

    【讨论】:

      【解决方案2】:

      select 很可能是在关闭的文件描述符上调用的。 通常的来源是重用fd_set 而不重新初始化它。 您在信号处理程序中有什么事情吗? (比如在 HUP 上重新打开日志文件?)

      【讨论】:

        【解决方案3】:

        如果您使用 poll(),那么您可以通过数据查找哪个 fd 失败了,这是最大的优势。

        【讨论】:

          猜你喜欢
          • 2012-02-15
          • 1970-01-01
          • 2015-06-10
          • 1970-01-01
          • 1970-01-01
          • 2012-10-13
          • 1970-01-01
          • 1970-01-01
          • 2012-05-27
          相关资源
          最近更新 更多