7

select()Linux/ARM プラットフォームで使用して、udp ソケットがパケットを受信したかどうかを確認しています。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);
    }
}
4

5 に答える 5

3

最も安全な方法は、あいまいな定義を無視して、select()自分で時間を計ることです。

選択の前後の時間を取得し、それを必要な間隔から差し引くだけです。

于 2009-01-29T15:40:04.117 に答える
1

私の記憶が正しければ、select() 関数はタイムアウトと I/O パラメータを処理し、select が返されると、タイムアウト変数に残り時間が返されます。

それ以外の場合は、電話をかける前に現在の時刻を記録し、後でもう一度記録して、2 つの時間差を取得する必要があります。

于 2009-01-27T23:23:43.967 に答える
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.
于 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 に答える