linux中信号提供了软中断的作用。提供了一种处理异步时间的方法 , 可以通过信号合理的安排异步任务。
下面我们应用SIGALARM,设置每秒执行一次的动作:
struct itimerval oneSec;
signal(SIGALRM, Demo_updateTime);
oneSec.it_value.tv_sec = 1;
oneSec.it_value.tv_usec = 0;
oneSec.it_interval.tv_sec = 1;
oneSec.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &oneSec, NULL);
Demo_updateTime()函数就是注册的每秒执行一次的函数。
switch(signo){
case SIGALRM:
time(&timeval) ;
localtime_r(&timeval, &tmCur) ;
//update date only once one day
if(tmOld.tm_mday != tmCur.tm_mday)
{
char temp[40];
//get day of week from this call only.
ctime_r(&timeval, temp);
sprintf(osdStr,"%04d-%02d-%02d ",tmCur.tm_year+1900,
tmCur.tm_mon+1,tmCur.tm_mday);
strncat(osdStr,temp,3);
}
实现精度较高的定时功能的话,就要使用setitimer函数。
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
struct timeval {
long tv_sec;
long tv_usec;
};需要signal.h和sys/time.h如果不需要这么高的精度,可用用alarm()函数:
alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。
所需头文件
#include<unistd.h>
函数原型
unsigned int alarm(unsigned int seconds)
函数参数
seconds:指定秒数
函数返回值
成功:如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。
出错:-1
原文:http://blog.csdn.net/daida2008/article/details/29387349