时间函数和定时线程(linux C )

1.日期时间输出格式:

printf("%04d-%02d-%02d\n",year,month,day);

输出:1994-02-07  d表示输出整数、2表示宽度、0表示不足两位前面补0,右对齐。


2.signal函数:

signal(SIGALRM,statistic);

线程收到SIGALRM信号,暂停手头工作,开始执行void statistic(int)函数。statistic执行完后,线程回到被中断的那一点继续执行后面的语句。


3.setitimer函数:

int res = setitimer(ITIMER_REAL,&tick,NULL);

if(res != 0)

std::cout<<"set timer fail"<

参数解释:

ITIMER_REAL:指明定时器到时后发信号SIGALRM

tick:struct itimerval的变量,itimerval结构如下:

struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
struct timeval {
long tv_sec;
long tv_usec;
};
tick.it_value指明定时器第一次触发时间,tick.it_interval指明触发间隔。

tick.it_value.tv_sec = 10;

tick.it_value.tv_usec = 0;

tick.it_interval.tv_sec = 5;

tick.it_interval.tv_usec = 0;

int res = setitimer(ITIMER_REAL,&tick,NULL);

if(res != 0)

std::cout<<"set timer fail"< 定时器10秒后将会触发,以后每隔5秒触发一次。触发后发 SIGALRM信号。

成功返回0。


4.pause函数:

pause();

线程会被挂起,直至被信号中断。线程被唤醒后,继续执行pause后面的语句。

防止线程退出,使定时线程连续工作:

while(1)

pause();


5.time函数:

time_t t = time(NULL);

返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。


6.localtime函数:

struct tm *tb = localtime(&t); //上面得到的t

把从1970-1-1零点零分到某一时间点经过的秒数转换为本地时间。

此函数获得的tm结构体的时间是日历时间。

struct tm {
          int tm_sec;       /* 秒 – 取值区间为[0,59] */
          int tm_min;       /* 分 - 取值区间为[0,59] */
          int tm_hour;      /* 时 - 取值区间为[0,23] */
          int tm_mday;      /* 一个月中的日期 - 取值区间为[1,31] */
          int tm_mon;       /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
          int tm_year;      /* 年份,其值等于实际年份减去1900 */
          int tm_wday;      /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
          int tm_yday;      /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
          int tm_isdst;     /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
          };

月份从0开始,年份从1900开始。

所以给定一个秒数t,对应的真正日期为:

std::cout<tm_year+1900<<"."<tm_mon+1<<"."<tm_mday<


7.mktime函数:

time_t t = mktime(tb); //上面得到的tb

用来将参数tb所指的tm结构的日历时间转换成从公元1970年1月1日0时0分0 秒算起至今的UTC时间所经过的秒数。


8.定时线程模型,下一小时第一次触发,以后每隔一小时触发一次。例如当前为18:39,则17:00第一次触发。

#include 
#include 
#include 
#include 


int main(){
	pthread_t tid;
	if(pthread_create(&tid,NULL,func,NULL) != 0){
		std::cout<<"timer thread create fail"<tm_hour++;
	tb->tm_min = 0;
	tb->tm_sec = 0;

	time_t t2 = mktime(tb);

	struct itimerval tick;
	tick.it_value.tv_sec =  t2- t1;
	tick.it_value.tv_usec = 0;
	tick.it_interval.tv_sec = 3600;
	tick.it_interval.tv_usec = 0;

	int res = setitimer(ITIMER_REAL,&tick,NULL);
	if(res != 0)
		std::cout<<"set timer fail"<


你可能感兴趣的:(时间函数和定时线程(linux C ))