select()
在出错时返回-1,在超时时返回0,并在成功时返回集合中描述符的数量。
假设我们有以下伪代码:
while(1){
int s = select(..., &timeout); //timeout = 5 sec
if (s < 0) { perror(...); }
else if(s == 0) { //timeout }
else {
//wait for some recv event or STDIN
}
}
我认识到该过程要么等到超时,要么等到某个recv事件发生。
我需要让它在指定时间内保持计数,同时只使用select()从任意数量的对等体接收。
我怎样才能做到这一点?
答案 0 :(得分:2)
在linux上,select
系统调用将超时值减去经过的时间。 Posix允许但不需要这种行为,这使得很难依赖;便携式代码应假设timeout
调用返回时未指定select
的内容。
唯一真正可移植的解决方案是首先计算您希望超时到期的绝对时间,然后检查每次后续调用之前的时间以选择以计算正确的超时值。注意可能倒退(或向前跳过)的时钟; CLOCK_MONOTONIC
通常是您最好的选择。