7

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

类似于以下内容:

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);
    }
}
4

5 回答 5

3

最安全的事情是忽略模糊的定义select()并自己计时。

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

于 2009-01-29T15:40:04.117 回答
1

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

否则,您将不得不在调用之前记录当前时间,然后再次获取两者之间的差异。

于 2009-01-27T23:23:43.967 回答
1

从 OSX 上的“人选”:

 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.
于 2009-01-28T23:59:45.907 回答
0

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

请注意,这不能跨其他系统移植(因此上面引用的 OS X 手册中的警告),但适用于 Linux。

吉拉德

于 2009-01-29T15:37:06.930 回答
-2

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

于 2011-12-23T03:31:59.813 回答