1、alarm
unsigned int alarm(unsigned int seconds)
函数说明: alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。
如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
void sigalrm_fn(int sig)
{
printf("alarm!\n");
alarm(2);
return;
}
int main(void)
{
signal(SIGALRM, sigalrm_fn);
alarm(1);
while(1) pause();
}
2、setitimer
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
which取值:
ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
it_value是当前定时器剩下的时间。一旦it_value的值为0时,它会被设定为it_interval。
如果定时器到期,而且it_interval的值为0,则不会重新启动该定时器。
同样地,如果一个活动中的定时器的it_value被设为0,则定时器会停止运行,而且不会被重新启动。
如果ovalue的值不是NULL,则which类型的时间间隔定时器先前的值会被返回。
signal(SIGALRM, sigroutine);
signal(SIGVTALRM, sigroutine);
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue);
value2.it_value.tv_sec = 0;
value2.it_value.tv_usec = 500000;
value2.it_interval.tv_sec = 0;
value2.it_interval.tv_usec = 500000;
setitimer(ITIMER_VIRTUAL, &value2, &ovalue);