我在Linux/ARM平臺上使用select()
來查看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);
}
}
我不確定你的問題是什麼。你的代碼解決了這個問題。剩餘時間寫入超時參數。 Quoth select(2):「在Linux上,select()修改超時以反映不睡眠的時間量;大多數其他實現不這樣做(POSIX.1-2001允許這兩種行爲之一)。」 – phihag 2009-01-27 22:34:44
@phihag:「許可任一行爲「......在選擇調用不可移植後精確查看超時值 – 2009-01-28 07:48:10