#include <sys/select.h>
#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itim erval value, struct itimerval *ovalue);
函数setitimer 可以提供三种定时器, 它们相互独立, 任意一个定时完成都将发送定时信号到进程, 并且
重新计时. 参数which确定了定时器的类型:
(1) ITIMER_REAL. 定时真实时间, 与alarm 类型相同. 对应信号为SIGALRM.
(2) ITIMER_VIRT. 定时进程在用户态下的实际执行时间. 对应信号为SIGVTALRM.
(3) ITIMER_PROF. 定时进程在用户态和核心态下的实际执行时间. 对应信号为SIGPROF.
在一个UNIX进程中, 不能同时使用alarm 和ITIMER_REAL 类定时器.
结构itimerval 描述了定时器的组成:
struct itimerval{
struct timeval it_interval;
struct timeval it_value;
}
结构成员it_value 指定首次定时的时间, 结构成员it_interval 指定下次定时的时间. 定时器工作时, 先
将it_value 的时间值减到 0, 发送一个信号, 再将it_vale 赋值为it_interval 的值, 重新开始定时, 如此反复.
如果it_value 值被设置为0, 则定时器停止定时.
结构timeval 秒数了一个精确到微秒的时间:
struct timeval{
long tv_sec;
long tv_usec;
}
下面设计了一个精确定时器的例子, 进程每1.5秒发送定时信号 SIGPROF, 用户可键入Ctrl+C 或
Delete 结束程序.
[bill@billstone Unix_study]$ cat time3.c
#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itim erval value, struct itimerval *ovalue);
函数setitimer 可以提供三种定时器, 它们相互独立, 任意一个定时完成都将发送定时信号到进程, 并且
重新计时. 参数which确定了定时器的类型:
(1) ITIMER_REAL. 定时真实时间, 与alarm 类型相同. 对应信号为SIGALRM.
(2) ITIMER_VIRT. 定时进程在用户态下的实际执行时间. 对应信号为SIGVTALRM.
(3) ITIMER_PROF. 定时进程在用户态和核心态下的实际执行时间. 对应信号为SIGPROF.
在一个UNIX进程中, 不能同时使用alarm 和ITIMER_REAL 类定时器.
结构itimerval 描述了定时器的组成:
struct itimerval{
struct timeval it_interval;
struct timeval it_value;
}
结构成员it_value 指定首次定时的时间, 结构成员it_interval 指定下次定时的时间. 定时器工作时, 先
将it_value 的时间值减到 0, 发送一个信号, 再将it_vale 赋值为it_interval 的值, 重新开始定时, 如此反复.
如果it_value 值被设置为0, 则定时器停止定时.
结构timeval 秒数了一个精确到微秒的时间:
struct timeval{
long tv_sec;
long tv_usec;
}
下面设计了一个精确定时器的例子, 进程每1.5秒发送定时信号 SIGPROF, 用户可键入Ctrl+C 或
Delete 结束程序.
[bill@billstone Unix_study]$ cat time3.c
#include <sys/select.h>
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int n = 0;
void timefunc(int sig){
fprintf(stderr, "ITIMER_PROF[%d]\n", n++);
signal(SIGPROF, timefunc);
}
int main()
{
struct itimerval value;
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 500000;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 500000;
signal(SIGPROF, timefunc);
setitimer(ITIMER_PROF, &value, NULL);
while(1);
return 0;
}