Linux(服务器编程):29---定时机制之I/O复用系统调用的超时参数

一、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;
    }
}
发布了1300 篇原创文章 · 获赞 827 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/103719077
今日推荐