从来好事天生俭,自古瓜儿苦后甜。这篇文章主要讲述Linux(程序设计):62---定时机制之I/O复用系统调用的超时参数相关的知识,希望能为你提供帮助。
- select系统调用,参见文章:javascript:void(0)
- poll系统调用,参见文章:javascript:void(0)
- epoll系统调用,参见文章:javascript:void(0)
- Linux下的3组I/O复用系统调用都带有超时参数,因此它们不仅能统一处理信号和I/O事件,也能统一处理定时事件。
- 但是由于I/O复用系统调用可能在超时时间到期之前就返回(有I/O事件发生),所以如果要利用它们来定时,就需要不断更新定时参数以反映剩余的时间
#define TIMEOUT 5000int 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=https://www.songbingjia.com/android/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=https://www.songbingjia.com/android/=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;
}
}
【Linux(程序设计):62---定时机制之I/O复用系统调用的超时参数】
推荐阅读
- Linux(内核剖析):07---进程调度总体概述(多任务系统策略时间片)
- Linux(内核剖析):18---内核数据结构总结(数据结构选择与算法复杂度分析)
- Linux(程序设计):61---定时机制之SIGALRM信号(附升序的定时器链表设计定时器链表处理非活动连接)
- Win8系统如何在多种显示模式中进行切换【图】
- Win8系统如何通过更多支持选项获得专业人员帮助
- Win8系统如何将常用图标添加到桌面
- Win8系统下如何联机获得帮助【图文】
- windows8系统电脑桌面图标的小箭头如何删除与恢复【图】
- WP8.1手机Lumia435/Lumia635在秘鲁推出