【转】Linux 定时器setitimer()

http://blog.sina.com.cn/s/blog_590be5290100izdf.html

用法:
#include <sys/time.h>

int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct
itimerval *ovalue);

功能描述:
获取或设定间歇计时器的值。系统为进程提供三种类型的计时器,每一类以不同的时间域递减其值。当计时器超时,信号被发送到进程,之后计时器重启动。

参数:
which:间歇计时器类型,有三种选择

ITIMER_REAL //数值为0,以系统真实的时间来计算,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,以该进程在用户态下花费的时间来计算,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2, 以该进程在用户态下和内核态下所费的时间来计算,发送的信号是SIGPROF。

value,ovalue:时间参数,原型如下

struct itimerval {
    struct
timeval it_interval;
    struct
timeval
it_value;

};

struct timeval {
    long
tv_sec;

long
tv_usec;

};

itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了.
然后再将it_value设置为it_interval值.
也就是先处理it_value中设置的值,为0后发送信号(根据which来判断发送什么信号),之后都是根据it_interval的值发送信号。若
it_value为0,就没有相应的信号产生了。

getitimer()用计时器的当前值填写value指向的结构体。
setitimer()将 value 指向的结构体设为计时器的当前值,如果ovalue不是NULL,将返回计时器原有值。

返回说明:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EFAULT:value 或ovalue是不有效的指针
EINVAL:其值不是ITIMER_REAL,ITIMER_VIRTUAL 或 ITIMER_PROF之一

例子:

 1 void sigroutine(int signo)
 2 {
 3  static int count1=0,count2=0;
 4
 5  switch (signo)
 6  {
 7  case SIGALRM:
 8   count1++;
 9   printf("Catch a signal -- SIGALRM \n");
10   printf("count1 = %d\n\n", count1);
11   signal(SIGALRM, sigroutine);
12   break;
13  case SIGVTALRM:
14   count2++;
15   printf("Catch a signal -- SIGVTALRM \n");
16   printf("count2 = %d\n\n", count2);
17   signal(SIGVTALRM, sigroutine);
18   break;
19  }
20  return;
21 }
22
23
24
25 int main()
26 {
27  struct itimerval value, ovalue, value2;
28  printf("process id is %d\n", getpid());
29
30  signal(SIGALRM, sigroutine);
31  signal(SIGVTALRM, sigroutine);
32
33
34
35  value.it_value.tv_sec = 2;
36  value.it_value.tv_usec = 0;
37  value.it_interval.tv_sec = 3;
38  value.it_interval.tv_usec = 0;
39  setitimer(ITIMER_REAL, &value, &ovalue);
40
41
42
43  value2.it_value.tv_sec = 1;
44  value2.it_value.tv_usec = 0;
45  value2.it_interval.tv_sec = 3;
46  value2.it_interval.tv_usec = 0;
47  setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
48
49
50
51  while(1);
52 }

【转】Linux 定时器setitimer(),布布扣,bubuko.com

时间: 2024-08-06 19:29:08

【转】Linux 定时器setitimer()的相关文章

Linux 定时器

也许,一本书你从头到尾都看完了,但也只是看完了. 也许,你似懂非懂的理解了. 但,当你准备用学来的这些东西做东西时,才发现:原来你根本没懂! 看书重要的不是看了多少,重要的是理解了多少,理解的多深多广! 一个傅里叶变换,一个小波,我怎么越看越晕? "学以致用"这四个字越来越被教育所忽视了. 如果不是图像处理我真不知道线性代数原来可以这么牛逼! ......................................... #include <stdio.h> #incl

linux定时器

我们常常有设置系统在某一时间执行相应动作的需求,比如设置电脑什么时候自动锁屏,什么时候自动关机,设置应用程序什么时候自动运行,什么时候自动退出.这些与时间相关的功能,都需要依靠操作系统中的定时器来实现. linux中定时器的使用原理很简单,你只需设置一个超时时间和相应的执行函数,系统就会在超时的时候执行一开始设置的函数.超时的概念有点模糊,它指的是你设定一个时间,如果当前的时间超过了你设定的时间,那就超时了.比如说,你设置五分钟后系统自动关机,系统会记住五分钟后的具体时间,也就是当前时间再加上五

linux c setitimer用法说明

在linux c编程中,setitimer是一个比较常用的函数,可用来实现延时和定时的功能,网上有各种零零散散的用法说明,都只提到了个别用法,今天抽空实践整理了一份比较详细的: 使用时需要引入的头文件: #include <sys/time.h> setitimer函数原型: int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 其中which参数表示类型,可选的值有:

Linux定时器接口

Linux定时器接口主要分为三类: 一. sleep(), unsleep, alarm(),引用了SIGALARM信号,在多线程中使用信号又是相当麻烦的. 二. nanosleep(), clock_nanosleep(),让线程挂起,程序失去响应,多线程网络编程中应该避免. 三. timerfd_create(),也是用信号来deliver超时,将时间转变成一个文件描述符,可以像其他I/O事件一样操作定时器,所以程序中在写I/O框架用到定时器首选timerfd_create(). 1. ti

Linux定时器 使用

1.alarm alarm()执行后,进程将继续执行,在后期(alarm以后)的执行过程中将会在seconds秒后收到信号SIGALRM并执行其处理函数. #include <stdio.h>#include <unistd.h>#include <signal.h>void sigalrm_fn(int sig){    printf("alarm!\n");    alarm(2);    return;}int main(void){    s

linux定时器的实现方法

Linux提供定时器机制,可以指定在未来的某个时刻发生某个事件,定时器的结构如下: struct timer_list { struct list_head list; unsigned long expires; unsigned long data; void (*function)(unsigned long); }; list 实现的时候使用的,和定时器功能无关expires 是定时器定时的滴答数(当前的滴答数为 jiffies )function 到那个时刻内核调用的函数data 由于

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

1.内核定时器: Linux 内核所提供的用于操作定时器的数据结构和函数如下: (1) timer_list 在 Linux 内核中,timer_list 结构体的一个实例对应一个定时器 1 struct timer_list { 2    struct list_head entry; /* 定时器列表 */ 3    unsigned long expires; /*定时器到期时间*/ 4    void (*function)(unsigned long); /* 定时器处理函数 */ 5

Linux定时器 timerfd使用

英文使用手册原汁原味,一手资料. NAME       timerfd_create, timerfd_settime, timerfd_gettime - timers that notify via file descriptors SYNOPSIS 1 #include <sys/timerfd.h> 2 3 int timerfd_create(int clockid, int flags); 4 5 int timerfd_settime(int fd, int flags, 6 c

Linux定时器工具-crontab 各參数具体解释及怎样查看日志记录

要使用crontab定时器工具,必需要启动cron服务: service cron start crontab的语法,以备日后救急.先上张超给力的图: crontab各參数说明: -e : 运行文字编辑器来编辑crontab,内定的文字编辑器是VI -r : 删除眼下的crontab -l : 列出眼下的crontab(查看专用) -i : 会和-r 配合使用,在删除当前的crontab时询问,输入y 则删除 注意crontab是分用户的,以谁登录就会编辑到谁的crontab crontab特殊