Linux C定时器使用

  作者:zhanhailiang 日期:2014-10-25

原理

Linux为每个进程提供3种定时器:

  1. ITIMER_REAL: 以系统真实的时间来计算,它送出SIGALRM信号。
  2. ITIMER_VIRTUAL: 以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
  3. ITIMER_PROF: 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。

其通过setitimer来初始化:

int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

设置定时器后在当前进程终止前每隔固定时间都会发送相应的信号。

此时我们通过sigaction来接收相应信号并处理相应逻辑:

int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

Demo

如下举例说明如何使用Linux定时器定时输出一段文本:

#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
 
#define PROMPT "2 seconds over\n\a"
 
char *prompt = PROMPT;
unsigned int len;
 
void prompt_info (int signo) {
    write (STDERR_FILENO, prompt, len);
}
 
/*
 * 设置收到SIGPROF信号的处理方式为prompt_info,打印一段文本
 */
void init_sigaction (void) {
    struct sigaction act;
    act.sa_handler = prompt_info;
    act.sa_flags = 0;
    sigemptyset (&act.sa_mask);
    sigaction (SIGPROF, &act, NULL);
}
 
/*
 * 设置ITIMER_PROF类型的定时器, 每隔2秒发送一次SIGPROF信号
 */
void init_time () {
    struct itimerval value;
    value.it_value.tv_sec = 2;
    value.it_value.tv_usec = 0;
    value.it_interval = value.it_value;
    setitimer (ITIMER_PROF, &value, NULL);
}
 
int main () {
    len = strlen (prompt);
    init_sigaction ();
    init_time ();
    while (1);
    exit (0);
}

编译执行如下:

[root@~/wade/codeReview/learningc/10]# gcc interval.c -o interval
[root@~/wade/codeReview/learningc/10]# ./interval
2 seconds over
2 seconds over
2 seconds over
2 seconds over
2 seconds over
^C
[root@~/wade/codeReview/learningc/10]# 

参考阅读

Linux操作系统下C语言编程入门:http://wenku.baidu.com/link?url=pqkDmO8ibRGlaTVfHLe-CjBv4eOglm_9mgaKfuux5S2LHk_80EO5ZZpBUeTibs4Eo1-6_rXSmcUSo1qQ8XkExR9kX6ulqf7h1yTSfmV4le_

时间: 2024-12-07 05:29:52

Linux C定时器使用的相关文章

linux 内核定时器详解

原文摘自:http://www.linux-cn.com/html/linux/kernel/20070412/1886.shtml Linux内核2.4版中去掉了老版本内核中的静态定时器机制,而只留下动态定时器.相应地在timer_bh()函数中也不再通过run_old_timers()函数来运行老式的静态定时器.动态定时器与静态定时器这二个概念是相对于Linux内核定时器机制的可扩展功能而言的,动态定时器是指内核的定时器队列是可以动态变化的,然而就定时器本身而言,二者并无本质的区别.考虑到静

模仿linux内核定时器代码,用python语言实现定时器

大学无聊的时候看过linux内核的定时器,现在已经想不起来了,也不知道当时有没有看懂,现在想要模仿linux内核的定时器,用python写一个定时器,已经想不起来它的设计原理了,找了一篇blog,linux 内核定时器 timer_list详解. 看了好一会才有些明白,开始参照着用python写了一个.如果在设计服务器的时候,有大量需要精确到秒和秒以下的事件,自己写一个定时器,维护一个类似与内核timer_vec的数据结构,处理服务的定时事件,还是蛮高效的. 附上python代码,github:

【整理】--Linux 内核定时器

一.LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <linux/timer.h> 和 kernel/timer.c 文件中. 被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则: 1) 没有 current 指针.不允许访问用户空间.因为没有进程上下文,相关代码和被中断的进程没有任何联系. 2) 不能执行休眠(或可能引起休眠的函数)和调度. 3) 任何被访问的数据结构

(二十四)linux新定时器:timefd及相关操作函数

timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itim

Linux内核定时器

Linux使用struct    timer_list来描述一个定时器. 重要成员: expires:定时时长 *function:超时执行函数名使用流程: 1.定义定时器变量 /*定义定时器变量结构体*/ struct timer_list key_timer; 2.初始化定时器 a.函数init_timer(timer) 参数:timer:要初始化的定时器的变量名 b.设置超时函数 /*初始化定时器*/ init_timer(&key_timer); key_timer.function =

Linux内核——定时器和时间管理

定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理程序是Linux系统内核管理机制中的中枢. 另外一个关注的焦点是动态定时器--一种用来推迟运行程序的工具. 比方说.假设软驱马达在一定时间内都未活动,那么软盘驱动程序会使用动态定时器关闭软驱马达. 内核能够动态创建或销毁动态定时器. 内核中的时间观念 内核在硬件的帮助下计算和管理时间. 硬件为内核提

Linux内核 - 定时器

#include <linux/timer.h> //头文件 struct timer_list mytimer; //定义变量 static void my_timer(unsigned long data) //定时器处理函数 { mod_timer(&mytimer, jiffies + 5*HZ); //重启定时器 } /* 初始化定时器 */ setup_timer(&mytimer, my_timer, (unsigned long)data); mytimer.e

Linux 高精度定时器hrtimer 使用示例【转】

本文转载自:http://blog.csdn.net/dean_gdp/article/details/25481225 hrtimer的基本操作 Linux的传统定时器通过时间轮算法实现(timer.c),但hrtimer通过红黑树算法实现.在struct hrtimer里面有一个node域,类型为struct rb_node,这个域代表了hrtimer在红黑树中的位置. hrtimer_start hrtimer_start函数将一个hrtimer加入到一个按照到期时间排序的红黑树中,其主要

Linux之定时器与时间管理 【转】

转自:http://blog.chinaunix.net/uid-23228758-id-154820.html 定时器与时间管理: 1.节拍率——HZ:在alpha体系结构上1024,而在其它平台上,都为10数量级倍.在嵌入式ARM上为100(2.6内核).这个值的意义是什么呢,也就是在ARM平台上时钟中断100次,为一秒.一般的情况下编程者不要改变这个值,因为内核编很多代码都是有时间要求的,而且内核编写都在很多地方都做了相应的优化与折衷处理,改变HZ的值会对系统的性能有很大的影响. 2.ji