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/guo8113/article/details/29386225