在linux下实现精度较高的定时功能,需要用到setitimer 和 getitimer函数。

函数原型:

#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);

· 函数getitimer()把指定的定时器类型( ITIMER_REAL,  ITIMER_VIRTUAL,  或 ITIMER_PROF中的一个)写入curr_value指向的结构。

it_value设置为定时器剩余时间(若定时器关闭则为0)。类似的,it_interval设置为复位时间。

分析形参:

1. int which

  which为定时器类型,setitimer支持3种类型的定时器:
ITIMER_REAL: 以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL: -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF: 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
 
2. const struct itimerval *value
  value 是一个指向itimerval类型的指针,介绍如下

struct itimerval
{
struct timeval it_interval;//next value
struct timeval it_value;//current value
};

timeval也是一个数据类型:

struct timeval
{
long tv_sec;
long tv_usec;
};

  it_interval指定间隔时间,it_value指定初始定时时间。如果只指定it_value,就是实现一次定时;如果同时指定 it_interval,则超时后,系统会重新初始化it_value为it_interval,实现重复定时;两者都清零,则会清除定时器。tv_sec提供秒级精度,tv_usec提供微秒级精度,以值大的为先。

3. struct itimerval *ovalue

  ovalue用来保存先前的值,通常设置为NULL。

每次定时循环结束会产生中断,通常会用到signal函数捕捉处理,原型为:

#include<signal.h>
void (* signal(int sig, void (*func) (int)) ) (int);

  signal()是一个系统调用,常用来设定某个信号(sig)的处理方法(func):

信号类型(sig)

(1) 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。

(2) 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。

(3) 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。

(4) 与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。

(5) 在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。

(6) 与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。

(7) 跟踪进程执行的信号。

下列宏常量表达式指定了标准的信号值:

Marcro Signal
SIGABRT 异常终止,如调用abort().
SIGFPE 如除0或操作结果溢出(不一定是浮点操作).
SIGILL 非法指令或无效的函数镜像,通常由于代码错误或执行数据引起.
SIGINT 交互式中断信号,通常由用户产生.
SIGSEGV 段冲突.访问非法存储空间时产生.
SIGTERM 发给本程序的中止信号.
 
 
 
 
 
 
 
 
 
 
 
 
处理方法(func)有三种,分别是:
  默认处理(SIG_DFL), 信号以其默认指定的行为进行处理。
  忽略信号(SIG_IGN), 信号被忽略而且程序会继续往下执行,即使没有任何意义。
  函数处理,以用户指定的函数来处理信号。
 
仅看原型比较抽象,举个例子就知道了:
  

#include<stdio.h>
#include<sys/time.h>
#include<signal.h> void response(void);
int main()
{
struct itimerval my_timer;
long n_sec, n_usec;
my_timer.it_interval.tv_sec = ;
my_timer.it_interval.tv_usec = *;//300ms
my_timer.it_value.tv_sec = ; //2s
my_timer.it_value.tv_usec = ; setitimer(ITIMER_REAL, &my_timer, NULL); signal(SIGALRM,(__sighandler_t)&response);
while()
;
return ;
} void response(void)
{
printf("Receive signal!!\n");
}

上述代码片段将定时器初始值设为2s,循环值为300ms,则当setitimer函数执行以后2s产生SIGALRM中断,由signal函数指定中断处理函数为response();

2s之后,每隔300ms产生一次SIGALRM中断。

参考文章:
http://www.uml.org.cn/c%2B%2B/200812083.asp
 
 

Unix环境编程之定时、信号与中断的更多相关文章

  1. UNIX环境编程学习——反思认识

     学习情况: 有关UNIX系统环境编程的学习时间用来非常长的时间.可是感觉效果还是不是太好,在中间经过了期末考试.用来非常长的时间用来学习专业课.就将该过程的学习放到了一边上,放假以后又回家造成了 ...

  2. Unix环境编程基础下

    Unix出错处理 当UNIX系统的函数出错时,通常会返回一个负值.我们判断函数的返回值小于0表示出错了,注意我们并不知道为什么出错.例如我们open一个文件,返回值-1表示打开失败,但是为什么打开失败 ...

  3. Unix系统编程()信号:概念和概述

    这篇将一口气学完信号的基本概念,但是有很多的细节,所以篇幅较长,请做好心理准备. (他大爷的,一口气没有学完,太懒了) 有以下主题: 各种不同信号及其用途 内核可能为进程产生信号的环境,以及某一进程向 ...

  4. 【UNIX环境编程、操作系统】孤儿进程和僵尸进程

    基本概念: 在类UNIX系统中,僵尸进程是指完成执行(通过exit系统调用,或运行时发生致命错误或收到终止信号所致)但在操作系统的进程表中仍然有一个进程表表项(进程控制块PCB),处于"终止 ...

  5. UNIX环境编程初步认识——编程环境搭建

     前言 前期学习了Linux的一些基本知识后,在借助前期的学习的基础上想再初步认识一下操作系统的一些环境编程体系相关知识,当中环境的配置和搭建费了非常大的劲,须要一点点摸索和尝试,下边是环境搭建的 ...

  6. 高级UNIX环境编程10 信号

    信号是软件中断,提供一种处理异步事件的方法 <signal.h> sigaction()

  7. UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字

    lienhua342014-11-03 1 信号传递过程 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如图 1 所示, 图 1: 信 ...

  8. Unix NetWork Programming(unix环境编程)——环境搭建(解决unp.h等源码编译问题)

    此配置实例亲测成功,共勉,有问题大家留言. 环境:VMware 10 + unbuntu 14.04 为了unix进行网络编程,编程第一个unix程序时遇到的问题,不能包含unp.h文件,这个感觉和a ...

  9. UNIX环境编程学习笔记(23)——信号处理初步学习

    lienhua342014-10-29 1 信号的概念 维基百科中关于信号的描述是这样的: 在计算机科学中,信号(英语:Signals)是 Unix.类 Unix 以及其他 POSIX 兼容的操作系统 ...

随机推荐

  1. php + apache + mysql环境搭建

    别人写的很好,若是不改变php默认访问路径的话,能够成功搭建是没问题的 http://www.cnblogs.com/pharen/archive/2012/02/06/2340628.html

  2. 记一次Surface Pro 2还原操作

    因为要做Azure的一个case,对自己的域环境下直接进行了捕获.结果导致机器直接crash. 重启后使用本地账号登陆后发现所有Win 8 的App都无法使用,包括进入设置中还原方式也无法使用. 可以 ...

  3. Oracle中的IF...THEN...ELSE判断

    if...then...else是最常见的一种判断语句,他可以实现判断两种情况. 标准语法如下: if <condition_expression> then plsql_sentence ...

  4. HTTP 错误 404.3 - Not Found

    在使用win2012服务器上的IIS发布网页的时候,出现下面的错误 解决办法: 将应用程序开发下的所有功能都安装. 如果上面的方法没解决问题的话,那么看看下图中的这些安装没,没有的话就继续安装.

  5. WPF-控件-层级控件-TreeView

    <?xml version="1.0" encoding="utf-8" ?> <Data xmlns=""> &l ...

  6. jquery定义表格宽度

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. iOS的影片播放 MediaPlayer 和 AVPlayer(转)

    分类: Iphone2013-01-28 16:19 5230人阅读 评论(0) 收藏 举报 在iOS開發上,如果遇到需要播放影片,如開機動畫…,我們很習慣地會使用MediaPlayer來播放影片,因 ...

  8. 【UI控件总结】【UIScrollView】深入理解篇UIScrollerView

    [UI控件总结][UIScrollView]基本方法+基本描述 接下来,我整理一下自己的思路,深入理解 UIScrollView 基本点 : 1 . UIScrollView 是一个UIView. 每 ...

  9. Quartz 2D画虚线-b

    这里使用的函数为 CGContextSetLineDash,有四个参数    CGContextSetLineDash(<#CGContextRef  _Nullable c#>, < ...

  10. bnuoj 25659 A Famous City (单调栈)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=25659 #include <iostream> #include <stdio.h ...