- alarm
如果不要求很精确的话,用 alarm() 和 signal() 就够了
unsigned int alarm(unsigned int seconds)
示例:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sigalrm_fn(int sig)
{
/* Do something */
printf("alarm!/n");
alarm(2);
return;
}
int main(void)
{
signal(SIGALRM, sigalrm_fn);
alarm(2);
/* Do someting */
while(1) pause();
}
2. setitimer
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
3种类型的定时器:
ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL : 以该行程真正有执行的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF : 以行程真正有执行及在核心中所费的时间来计算,它送出SIGPROF信号。
Setitimer()第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例;第三个参数可不做处理。
Setitimer()调用成功返回0,否则返回-1。
下面是关于setitimer调用的一个简单示范,在该例子中,每隔一秒发出一个SIGALRM,每隔0.5秒发出一个SIGVTALRM信号::
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
struct itimerval itimer;
itimer.it_interval.tv_sec = 0;
itimer.it_interval.tv_usec = 40000;//10 -6
itimer.it_value.tv_sec = 1;
itimer.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itimer, NULL);
struct sigaction sigact;
sigfillset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigact.sa_handler=proc_alarm;
sigaction(SIGALRM, &sigact, NULL);