Linux操作系统为每一个进程提供了3个内部计时器。ITIMER_REAL;ITIMER_VIRTUAL;ITIMER_PROF.ITIMER_REAL:给定一个指定的时间间隔,按照实际的时间来减少这个计数,当时间间隔为0的时候发出SIGALRM信号。ITIMER_VIRTUAL:给定一个时间间隔,当进程执行的时候才减少计数,时间间隔为0的时候发出SIGVTALRM信号。ITIMER_PROF:给定一个时间间隔,当进程执行或者是系统为进程调度的时候,减少计数,时间到了,发出SIGPROF信号,这个和TIMER_VIRTUAL联合,常用来计算系统内核时间和用户时间。看一下getitimer的数据手册getitimer, setitimer - get or set value of an interval timer#include <sys/time.h>int getitimer(int which, struct itimerval *value);int setitimer(int which, char struct itimerval *value, struct itimerval *ovalue);ITIMER_REAL;ITIMER_VIRTUAL;ITIMER_PROF.就是三个定时器,在使用的时候,当其中的任何一个时间到了,都会给进程发送一个信号,然后定时器重新被装填,重新开始定时动作。它们对应的信号ITIMER_REAL ---- SIGALRMITIMER_VIRTUAL ---- SIGVTALRMITIMER_PROF ---- SIGPROF函数中的which就是选择这三个定时器中的一个。下面是描述时间结构体value的struct itimerval {struct timeval it_interval; //下一个值struct timeval it_value; //当前的值};struct timeval {long tv_sec; //秒long tv_usec; //毫秒};一个表示时间的结构体,一个含有时间结构体的结构体。使用定时器的时候,首先定义一个时间结构体,然后初始化这个时间结构体的秒和毫秒。然后使用setitimer函数,第一个参数指定使用哪一个定时器,第二个参数就是传递进去的时间结构体,第三个参数为NULL。这样就设定好了一个定时器了。它就可以开始工作了。说一下返回值: 函数调用成功返回0, 错误返回-1,并且设置出错值errno。当出错的时候:可能是value或者是ovalue指针无效;或者是定时器搞错了,不是这三个中的一个;或者是时间结构体中的毫秒超出了0到999999的范围。由于当定时器的时间到了的时候会引发一个信号,因此我们必须对信号进行处理,因此需要了解一下信号处理的函数。我们可以修改Linux系统信号的相关联的动作,也就是当捕获到某个信号时需要执行什么函数。有点像是可以更改函数指针指向的函数一样。有这么一个函数可以完成这个问题:sigaction。也就是sig-action,signal-action,信号动作。#include<sginal.h>int sigaction(int signo, const struct sigacton *rstrict act, struct sigaction *restrict oact);这个函数具有三个参数,第一个是信号的名字,直接写系统的信号名,比如SIGALRM之类的。第二个参数是一个结构体,表述了信号相关的东西,我们修改的函数指针就在里面。第三个函数是用来返回的,返回该信号的上一个动作,也就是上一个这个信号结构体里面的函数指针指向的函数。
Linux下select()中的timeout的设置与不设置问题Linux下普通用户如何使用sudo相关资讯 Linux教程
- Linux教程:如何在命令行中查看目 (07/28/2014 12:22:23)
- Linux 修改root密码 (11/03/2012 07:53:38)
- su - root 与su root的区别 (06/06/2012 00:39:40)
| - Linux进程间通信:消息队列 (01/28/2013 09:43:00)
- U盘安装Linux开机无法启动解决方法 (10/07/2012 08:55:52)
- Windows 7/Linux 同步时间 (05/15/2012 06:17:55)
|
本文评论 查看全部评论 (0)