我们常常有设置系统在某一时间执行相应动作的需求,比如设置电脑什么时候自动锁屏,什么时候自动关机,设置应用程序什么时候自动运行,什么时候自动退出。这些与时间相关的功能,都需要依靠操作系统中的定时器来实现。

  linux中定时器的使用原理很简单,你只需设置一个超时时间和相应的执行函数,系统就会在超时的时候执行一开始设置的函数。超时的概念有点模糊,它指的是你设定一个时间,如果当前的时间超过了你设定的时间,那就超时了。比如说,你设置五分钟后系统自动关机,系统会记住五分钟后的具体时间,也就是当前时间再加上五分钟。过了五分钟后,系统当前时间已经比刚才设置的具体时间大了,出现超时,于是运行超时行为。

  在linux中,使用alarm函数可以设置一个定时器,当定时器超时的时候,会产生SIGALRM信号。因此,要设置超时行为,就得在SIGALRM信号上设置相应的函数。

  包含头文件:#include <unistd.h>

  函数原型:unsigned int alarm(unsigned int seconds);

  具体例子如下:  

#include <stdio.h>
#include <signal.h>
#include <unistd.h> void SigFun(int signo){
printf("SigFun is running\n");
} int main(){
if(signal(SIGALRM, SigFun) == SIG_ERR){
perror("signal\n");
     return -1;
}
alarm();
pause();
}

  在linux中,一个进程只能有一个定时器,因此当一个进程需要设置多个定时行为时,需要采取相应的措施,使得一个定时器可以实现多个定时。主要的方法有两种,一种叫时间链,一种叫时间堆。

  时间链是将所有定时行为以链表的方式连在一起,同时在进程中维护一个固定时间超时的定时器。当定时器超时的时候,检查链表上所有的行为是否超时,如果有超时的行为,则运行其行为,并将其从链表中删除。这用方法最大的坏处就是需要固定时间遍历整个链表,造成了比较大的开销。

  时间堆是将所有定时行为以最小堆的方式组织起来,并且在进程中维护一个以堆顶为超时时间的定时器。当定时器超时时,检查堆顶行为是否超时,如果超时,则运行该行为,并将其从堆顶删除,接着继续检查;如果堆顶行为未超时,则用其超时时间继续设置定时器。时间堆不用固定时间去检查所有定时行为,只需在超时的时候运行相应的超时行为,效率比时间链高。

  在linux中,alarm函数是以秒计时的,当有时我们需要更小的时间单位去设置行为,比如毫秒,应该怎么办呢?linux提供setitimer函数,可以提供更精确的定时器。

  包含头文件:#include <sys/time.h>

  函数原型:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

  参数:

  int which有三种选择:

  ITIMER_REAL:decrements in real time, and deliversSIGALRM upon expiration.

  ITIMER_VIRTUAL:decrements only  when  the  process  is  executing,  anddeliversSIGVTALRM upon expiration.

  ITIMER_PROF:decrements  both  when the process executes and when the system is executing on behalf of the  process. Coupledwith  ITIMER_VIRTUAL, this timer is usually used to profile the time spent by the application in user and  kernel space.  SIGPROF is delivered

  const struct itimerval *new_value的数据结构如下:

struct itimerval {
struct timeval it_interval; /* 第一次超时以后每次超时的时间 */
struct timeval it_value; /* 第一次超时的时间 */
};
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};

  struct itimerval *old_value是原来设置的时间,如果不需要用到,可以用NULL

  成功调用返回0,失败返回-1。

  具体例子如下:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h> void SigFun(int signo){
printf("SigFun is running\n");
} int main(){
if(signal(SIGALRM, SigFun) == SIG_ERR){
perror("signal\n");
return -;
} struct itimerval tv;
tv.it_value.tv_usec = ;
tv.it_value.tv_sec = ;
tv.it_interval.tv_usec = ;
tv.it_interval.tv_sec = ; if(setitimer(ITIMER_REAL, &tv, NULL) != ){
perror("setitimer\n");
return -;
} while(true){
pause();
}
}

linux定时器的更多相关文章

  1. linux定时器用法

    linux定时器  原文出自http://www.cnblogs.com/processakai/archive/2012/04/11/2442294.html 今天看书看到了关于alarm的一些用法 ...

  2. linux定时器crontab

    linux定时器crontab用法: 1.基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示 ...

  3. Linux 定时器应用【转】

    Linux 定时器应用 实验目的 阅读 Linux 相关源代码,学习 Linux 系统中的时钟和定时器原理,即,ITIMER_REAL实时计数,ITIMER_VIRTUAL 统计进程在用户模式执行的时 ...

  4. 4412 Linux定时器

    一.Linux定时器基础知识 1.1 定时器的使用范围 延后执行某个操作,定时查询某个状态:前提是对时间要求不高的地方 1.2 内核时间概念 Hz:(系统时钟通过CONFIG_HZ来设置,范围是100 ...

  5. linux定时器(crontab)实例

    linux实验示例----实现每2分钟将“/etc”下面的文件打包存储到“/usr/lobal”目录下 ·Step1:编辑当前用户的crontab并保存终端输入:>crontab -u root ...

  6. Linux定时器相关源码分析

    Linux的定时器使用时间轮算法.数据结构不难理解,核心数据结构与散列表及其相似,甚至可以说,就是散列表.事实上,理解其散列表的本质,有助于对相关操作的理解. 数据结构 这里先列出一些宏,稍后解释: ...

  7. Smart210学习记录-----linux定时器

    1.内核定时器: Linux 内核所提供的用于操作定时器的数据结构和函数如下: (1) timer_list 在 Linux 内核中,timer_list 结构体的一个实例对应一个定时器 1 stru ...

  8. linux 定时器编程实例(完善中).....

    最近在写linux 下的定时器编程实验,测试发现 usleep函数在 x86 架构下的定时还是比较准确的,在arm9下 就不太准了. 今天用linux 下的setitimer()函数进行了定时 器的测 ...

  9. linux定时器HZ和Jiffies

    1.linux HZ Linux核心几个重要跟时间有关的名词或变数,以下将介绍HZ.tick与jiffies. HZ Linux核心每隔固定周期会发出timer interrupt (IRQ 0),H ...

随机推荐

  1. arm 及ndk编译

        首页  »   Android android的armeabi跟armeabi-v7a 网友分享于:2014-03-16  浏览:867次 android的armeabi和armeabi-v7 ...

  2. Mondriaan's Dream - POJ 2411(状态压缩)

    题目大意:有一些1*2的矩形,现在用这些小矩形覆盖M*N的大矩形,不能重复覆盖,并且要覆盖完全,求有多少种覆盖方式. 分析:可以使用1和0两种状态来表示这个位置有没有放置,1表示放置,0表示没有放置, ...

  3. Coprimes - SGU 102(求互质数,水)

    题目大意:给你一个正整数N,求出来不超过N 的并且与N互质的正整数的个数. 就是一个大水题~~~ 代码: #include<stdio.h> #include<string.h> ...

  4. 324. Wiggle Sort II

    这个题真是做得我想打人了.我生起气来连自己都打. 一开始quick select没啥可说的.但是in place把老命拼了都没想出来.. 看网上的答案是3 partition,MAP式子一看就由衷地反 ...

  5. ecshop格式化商品价格

    <?php /** * 格式化商品价格 * * @access public * @param float $price 商品价格 * @return string */ function pr ...

  6. Java 23种设计模式详尽分析与实例解析之二--结构型模式

    Java设计模式 结构型模式 适配器模式 模式动机:在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式.通常情况下,客户端可以通过目标类的接口访问它所提供的服务.又是,现有的类可以满足客 ...

  7. javascript的执行顺序

    先看下面两段js程序,先是定义式函数写法: 复制代码 <script type="text/javascript"> function myfunc(){ alert( ...

  8. 小猪的Android入门之路 Day 3 - part 3

    小猪的Android入门之路 Day 3 - part 3 各种UI组件的学习 Part 3 本节引言: 在前面两个部分中我们对Android中一些比較经常使用的基本组件进行了一个了解, part 1 ...

  9. 对vpn的认识

    网上关于vpn的资料非常多,看后眼花缭乱,仍然感觉一片混沌.网上,网下參考一些资料后.试着理清一些概念问题,由于,概念理清了,找到门了,才不至于左右徘徊,一片混沌. 首先vpn,这个我们都知道叫虚拟专 ...

  10. [RxJS] Filtering operator: filter

    This lesson introduces filter: an operator that allows us to let only certain events pass, while ign ...