- select系统调用,参见文章:https://blog.csdn.net/qq_41453285/article/details/89607091
- poll系统调用,参见文章:https://blog.csdn.net/qq_41453285/article/details/89672980
- epoll系统调用,参见文章:https://blog.csdn.net/qq_41453285/article/details/89343074
一、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;
-
}
-
}
转载:https://blog.csdn.net/qq_41453285/article/details/103719077
查看评论