一、I/O复用系统调用的超时参数
- Linux下的3组I/O复用系统调用都带有超时参数,因此它们不仅能统一处理信号和I/O事件,也能统一处理定时事件。
- 但是由于I/O复用系统调用可能在超时时间到期之前就返回(有I/O事件发生),所以如果要利用它们来定时,就需要不断更新定时参数以反映剩余的时间
二、代码演示案例
#define TIMEOUT 5000
int main()
{
int timeout=TIMEOUT;
time_t start=time(NULL);
time_t end=time(NULL);
while(1)
{
printf("the timeout is now %d mil-seconds\n",timeout);
start=time(NULL);
int epoll_ret_value=epoll_wait(epollfd,events,MAX_EVENT_NUM,timeout);
//epoll_wait函数出错
if((epoll_ret_value<0)&&(errno!=EINTR)){
printf("epoll failure");
break;
}
/*如果epoll_wait返回0,说明超时时间到了,
那么便可处理定时任务,并重置定时时间*/
if(epoll_ret_value==0){
timeout=TIMEOUT;
continue;
}
end=time(NULL);
/*如果epoll_wait的返回值大于0,则本次epoll_wait调用持续
的时间是(end-start)*1000ms,我们需要将定时时间timeout减
去这段时间,以获得下次epoll_wait调用的超时参数*/
timeout-=(end-start)*1000;
/*重新计算之后的timeout值有可能等于0,说明本次epoll_wait调用返回时,
不仅有文件描述符就绪,而且其超时时间也刚刚好,
此时我们也要处理定时任务,并重置定时时间*/
if(timeout<=0)
timeout=TIMEOUT;
}
}