Linux(程序设计):62---定时机制之I/O复用系统调用的超时参数

Posted 董哥的黑板报

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux(程序设计):62---定时机制之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;
    }
}

 

以上是关于Linux(程序设计):62---定时机制之I/O复用系统调用的超时参数的主要内容,如果未能解决你的问题,请参考以下文章

Linux(程序设计):60---定时机制之SO_RCVTIMEOSO_SNDTIMEO选项(附设置connect超时时间案例)

Linux网络编程之epoll知识点备忘

Linux之异步通知机制分析

MSP430的I/O中断和看门狗定时器能同时使用吗?

IO模型之二-linux网络IO模式select,poll,epoll

(笔记)Linux内核学习之I/O层和I/O调度机制