linux定时器

 

简介

这篇文章主要记录我在试图解决如何尽可能精确地在某个特定的时间间隔执行某项具体任务时的思路历程,并在后期对相关的API进行的归纳和总结,以备参考。

问题引出

很多时候,我们会有类似“每隔多长时间执行某项任务 ”的需求,乍看这个问题并不难解决,实则并不容易,有很多隐含条件需要考虑,诸如:时间精度是多少?时间是否允许出现偏差,允许的偏差是多少,偏差之后如何处理?系统的负载如何?这个程序允许占用的系统资源是否有限制?这个程序运行的硬件平台如何?

为了便于分析,我们锁定题目为“每隔2妙打印当前的系统时间(距离UNIX纪元的秒数) ”。

基于sleep的朴素解法

看到这个题目,我想大家的想法和我一样,都是首先想到类似这样的解法:


# include < stdio. h>

int main( int argc, char * argv[ ] )
{
        while ( 1) {
                printf ( "%d/n" , time ( NULL ) ) ;
                sleep ( 2) ;
        }

        return 0;
}


如果对时间精度要求不高,以上代码确实能工作的很好。因为sleep的时间精度只能到1s:

       # include < unistd. h>

       unsigned int sleep ( unsigned int seconds) ;


所以对于更高的时间精度(比如说毫秒)来说,sleep就不能奏效了。如果沿着这个思路走下去,还分别有精确到微妙和纳秒的函数usleep和nanosleep可用:

      # include < unistd. h>

       int usleep ( useconds_t usec) ;

   Feature Test Macro Requirements for glibc ( see feature_test_macros( 7) ) :

       usleep ( ) : _BSD_SOURCE | | _XOPEN_SOURCE > = 500


      # include < time . h>

       int nanosleep ( const struct timespec * req, struct timespec * rem) ;

   Feature Test Macro Requirements for glibc ( see feature_test_macros( 7) ) :

       nanosleep ( ) : _POSIX_C_SOURCE > = 199309L


既然有了能精确到纳秒的nanosleep可用,上面的较低精度的函数也就可以休息了。实际上在Linux系统下,sleep和usleep就是通过一个系统调用nanosleep实现的。

用带有超时功能的API变相实现睡眠

如果开发者不知道有usleep和nanosleep,这个时候他可能会联想到select类的系统调用:

      

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值