记录我自己的成长....
分类: LINUX
2013-10-25 21:21:28
点击(此处)折叠或打开
点击(此处)折叠或打开
2、用间隔计时器,
实验中用的系统调用函数有,
#include
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
使用这个函数来安装消息处理函数,第一个参数是消息号,在实验中是SIGALRM,第二个参数是一个函数类型,用它来指定了消息处理函数。
在我的实验中我signel函数指定SIGALRM信号的处理函数,当时间用尽时发送消息,进行消息处理,来输出ON/OFF信息。
#include
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
使用这个函数设定间隔计时器的值。
系统为每个进程提供三种间隔计时器,每种计时器时间用尽时都会给进程发送相应的信号。
这三种计时器通过setitimer的第一个参数which来指定,
这三种间隔计时器所计的时间分别为:
真实时间——当which为ITIMER_REAL时,表示是真实时间,这个时间和手表上的时间一样。当真实时间用尽时会发送一个SIGALRM消息。
进程时间——当which为ITIMER_VIRTUAL时,是指进程在用户态执行的时间。当进程时间用尽时会发送一个SIGVTALRM消息。
实用时间——当which为ITIMER_PROF时,是指进程在用户态和核心态执行的时间。当实用时间用尽时会发送一个SIGPROF消息。
对于这个三个时间,我的理解是,在一个进程生存周期内,其在内核态执行时,所用的时间是内核时间,在用户态执行的时间为用户时间,除去这个两个活动时间
进程还有休眠时间,而真实时间,是我们日常生活中所用的时间,比如1分钟。对于进程来讲,真实时间就是内核时间和用户时间以及休眠时间的和。实用时间是进程
占用处理器执行的时间,包含内核态和用户态。
第二个参数是一个结构变量,这个结构的定义如下:
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
}
struct timeval {
long tv_sec;
long tv_usec;
}
在这个结构中it_interval的值是用来当it_value的减到0时,被重新加载到it_value中,而it_value的值就是计数的值。
第三个参数是用来保存原来的itimerval的值的,可以设定为NULL,不保持原来的itimerval的值。
3、实验的代码
下载地址