select()调用剩余时间

时间:2009-01-27 22:22:03

标签: c linux select polling

我在Linux / ARM平台上使用select()来查看udp套接字是否收到了数据包。如果它在超时之前返回(检测到数据包),我想知道select select中剩余多少时间。

有些事情:

int wait_fd(int fd, int msec)
{
    struct timeval tv;
    fd_set rws;

    tv.tv_sec = msec / 1000ul;
    tv.tv_usec = (msec % 1000ul) * 1000ul;

    FD_ZERO( & rws);
    FD_SET(fd, & rws);

    (void)select(fd + 1, & rws, NULL, NULL, & tv);

    if (FD_ISSET(fd, &rws)) { /* There is data */
        msec = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
        return(msec?msec:1);
    } else { /* There is no data */
        return(0);
    }
}

5 个答案:

答案 0 :(得分:3)

最安全的做法是忽略select()的含糊不清的定义并自己计时。

只需获取选择前后的时间,然后从您想要的时间间隔中减去该时间。

答案 1 :(得分:1)

如果我没记错的话,select()函数会处理超时和I / O参数,当select返回时,剩余的时间会在超时变量中返回。

否则,您必须在通话前记录当前时间,并在之后再次记录并获取两者之间的差异。

答案 2 :(得分:1)

来自OSX上的“man select”:

 Timeout is not changed by select(), and may be reused on subsequent calls, however it 
 is good style to re-ini-tialize it before each invocation of select().

你需要在调用select之前调用gettimeofday,然后在退出时调用gettimeofday。

[编辑]似乎linux略有不同:

   (ii)   The select function may update the timeout parameter to indicate
          how much time was left. The pselect  function  does  not  change
          this parameter.

   On Linux, the function select modifies timeout to reflect the amount of
   time not slept; most other implementations do not do this.  This causes
   problems  both  when  Linux code which reads timeout is ported to other
   operating systems, and when code is  ported  to  Linux  that  reuses  a
   struct  timeval  for  multiple selects in a loop without reinitializing
   it.  Consider timeout to be undefined after select returns.

答案 3 :(得分:0)

Linux select()更新超时参数以反映过去的时间。

请注意,这不能在其他系统上移植(因此上面引用的OS X手册中的警告),但可以与Linux一起使用。

吉拉德

答案 4 :(得分:-3)

不要使用select,尝试使用大于1024的fd代码,看看你会得到什么。