errorfds vs select 返回值,select() 立即返回?

问题描述

我来维护一个软件:

  /*... init,setting timeout,etc ... */

  FD_ZERO(&set);
  FD_SET(socket_,&set);

  int selectRes = select(socket_ + 1,&set,NULL,&timeout);
  if (selectRes < 0) {
    throw IoException("Select: ",errno);
  }

  if (selectRes == 0) {
    throw TimeoutException();
  }

  /* ... then handle recvfrom,throw IoException if return < 0 ... */

IoException 应该导致程序终止。超时异常恢复操作。无一例外地通过循环返回。 socket_ 是一个 UNIX 数据报套接字(从另一个本地进程读取消息)。

该程序以非常高的优先级运行(需要快速响应消息),但预计大部分时间都处于空闲状态,等待 select() 超时等待传入消息。同时,它似乎有时会占用 100% 的 cpu 时间(没有收到足够的消息来授予这种行为)。出现的情况相当不稳定,别介意程序的高优先级让调试变得非常困难(一个小型​​的单核 Linux 嵌入式系统,其他一切都停止了)。

我担心 errorfds 位置的 NULL - 在这种情况下正在测试 select() 的返回值,或者如果套接字上存在错误条件但 errorfds 可能 select() 立即返回(带有 0)是 NULL,并在每次循环回 select() 时继续重复此操作?

或者,除了大量消息之外,还有哪些其他情况可以使 select() 立即退出(或者可能在自旋锁中等待而不是释放 cpu 时间)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)