当前位置: 技术问答>linux和unix
linux内核定时器
来源: 互联网 发布时间:2016-12-09
本文导语: 我做的程序需要两个定时器,一个用于自动备份,一个用于自动清理所以我觉得用alarm()的话,统一发送SIG_ALRM信号是不行的,所以我采用了struct timer_list和add_timer机制,但是发现要包含linux/timer.h,所以不得不改用...
我做的程序需要两个定时器,一个用于自动备份,一个用于自动清理所以我觉得用alarm()的话,统一发送SIG_ALRM信号是不行的,所以我采用了struct timer_list和add_timer机制,但是发现要包含linux/timer.h,所以不得不改用模块编程(正好可以深入一下内核),可是发现在内核里包含time.h并调用localtime(),mktime()等函数都不行,后来又改包含linux/time.h,发现那个里面的函数跟time.h不一样,请各位指点一下怎样做。
另外,我对内核模块的编译也很迷糊,希望各位大侠可以耐心指点一下。不胜感谢。我的模块代码和makefile如下,请指正:
#include
#include
#include
#include
#include
static int backup_time=0; //模块参数,自动备份时间
static int clean_time=0; //模块参数,自动清理时间
struct timer_list backup_timer[2]; //全局变量,两个计时器
int DB_BACKUP()
{
return 0;
}
int DB_CLEAN()
{
return 0;
}
//自动备份函数
void auto_backup(unsigned long data)
{
struct timeval hour;
hour.tv_sec=86400;
hour.tv_usec=0;
int jiffies_t=tvtojiffies(&hour);
//设置第一个计时器
backup_timer[0].expires=jiffies_t;
backup_timer[0].data=1;
backup_timer[0].function=DB_BACKUP;
add_timer(&backup_timer[0]);
//实现备份功能
DB_BACKUP();
return;
}
//自动清理
void auto_clean(unsigned long data)
{
struct timeval hour;
hour.tv_sec=86400;
hour.tv_usec=0;
int jiffies_t=tvtojiffies(&hour);
//设置自动清理定时器
backup_timer[1].expires=jiffies_t;
backup_timer[1].data=0;
backup_timer[1].function=DB_CLEAN;
add_timer(&backup_timer[1]);
DB_CLEAN();
return;
}
//初始化两个定时器
int set_backup_timer()
{
printk(KERN_ALERT "Auto Backup:%d,Auto Clean:%d",backup_time,clean_time);
struct tm tm_v;
time_t time1,time2;
struct timeval hour;
hour.tv_usec=0;
time1=time(NULL); //姹傚嚭褰撳墠鏃堕棿
memcpy((char *)&tm_v,(char *)localtime(&time1),sizeof(struct tm));
tm_v.tm_min=0;
tm_v.tm_sec=0; //鍚屼笂
tm_v.tm_hour=backup_time;
time2=mktime(&tm_v);
if((hour.tv_sec=difftime(time2,time1))
另外,我对内核模块的编译也很迷糊,希望各位大侠可以耐心指点一下。不胜感谢。我的模块代码和makefile如下,请指正:
#include
#include
#include
#include
#include
static int backup_time=0; //模块参数,自动备份时间
static int clean_time=0; //模块参数,自动清理时间
struct timer_list backup_timer[2]; //全局变量,两个计时器
int DB_BACKUP()
{
return 0;
}
int DB_CLEAN()
{
return 0;
}
//自动备份函数
void auto_backup(unsigned long data)
{
struct timeval hour;
hour.tv_sec=86400;
hour.tv_usec=0;
int jiffies_t=tvtojiffies(&hour);
//设置第一个计时器
backup_timer[0].expires=jiffies_t;
backup_timer[0].data=1;
backup_timer[0].function=DB_BACKUP;
add_timer(&backup_timer[0]);
//实现备份功能
DB_BACKUP();
return;
}
//自动清理
void auto_clean(unsigned long data)
{
struct timeval hour;
hour.tv_sec=86400;
hour.tv_usec=0;
int jiffies_t=tvtojiffies(&hour);
//设置自动清理定时器
backup_timer[1].expires=jiffies_t;
backup_timer[1].data=0;
backup_timer[1].function=DB_CLEAN;
add_timer(&backup_timer[1]);
DB_CLEAN();
return;
}
//初始化两个定时器
int set_backup_timer()
{
printk(KERN_ALERT "Auto Backup:%d,Auto Clean:%d",backup_time,clean_time);
struct tm tm_v;
time_t time1,time2;
struct timeval hour;
hour.tv_usec=0;
time1=time(NULL); //姹傚嚭褰撳墠鏃堕棿
memcpy((char *)&tm_v,(char *)localtime(&time1),sizeof(struct tm));
tm_v.tm_min=0;
tm_v.tm_sec=0; //鍚屼笂
tm_v.tm_hour=backup_time;
time2=mktime(&tm_v);
if((hour.tv_sec=difftime(time2,time1))