一、alarm函数
头文件: #include <unistd.h>
函数声明:unsigned int alarm ( unsigned int seconds )
功能:设置信号SIGALRM 在经过指定的秒数(seconds) 后传送给当前进程
返回值:(每个进程只能有一个alarm维护的"闹钟")如果"闹钟"顺利超时, 则返回0;如果"闹钟"在计时过程中, 调用了另一个alarm函数, 则该"闹钟"的余留秒数作为该次alarm的返回值, 并且新的"闹钟"开始计时。(实际上是新的闹钟替代了以前的闹钟)
二、setitimer函数
头文件: #include <sys/time.h>函数声明:int setitimer ( int which, const struct itimerval * value, struct itimerval * ovalue );
功能:(实现精度较高的定时功能)
1)设置一段时间后,才执行某个function
2)设置每间格一段时间就执行某个function
工作机制:先对it_value倒计时,当it_value为零时触发信号,然后重置为it_interval,继续对it_value倒计时,一直这样循环下去。
第一个参数which指定定时器类型:
(数值0)ITIMER_REAL: 以系统真实的时间来计算,它送出SIGALRM信号。
(数值1)ITIMER_VIRTUAL: 以该进程在
用户态下花费的时间来计算,它送出SIGVTALRM信号。
(数值2)ITIMER_PROF: 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
第二个参数是结构itimerval的一个实例:
struct itimerval {
struct timeval it_interval;//指定间隔时间
struct timeval it_value; //初始定时时间
};
struct timeval {
long tv_sec;
//秒级精度
long tv_usec;
//微秒级精度(1/1000000s)
};
关于it_value\it_interval值设定的三种情况:
1)如果同时指定 it_interval,则超时后,系统会重新初始化it_value为it_interval,实现重复定时
2)如果只指定it_value,就是实现一次定时
3)如果两者都清零,则会清除
定时器
第三个参数ovalue用来保存先前的值,通常用不上,常设为NULL或者忽略
注:
setitimer()一个进程中只能有一个 下一个会覆盖前一个的定时 想一个进程多个定时器只能自己实现。
setitimer()不支持在同一进程中同时使用多次以支持多个定时器。
简单代码示例:
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
void signalHandler ( int signo )
{
switch ( signo )
{
case SIGALRM :
printf( "Caught the SIGALRM signal!\n" );
break;
}
}
int main ( int argc, char * argv[] )
{
signal( SIGALRM, signalHandler );
struct itimerval n_v;
n_v.it_value.tv_sec = 2;
n_v.it_value.tv_usec = 0;
n_v.it_interval.tv_sec = 0;
n_v.it_interval.tv_usec = 200000;
setitimer( 0, &n_v, NULL );
for( ;; );
return( 0 );
}
结果分析:
延时2秒便触发一次SIGALRM信号,以后每隔0.2秒触发一次SIGALRM信号。