我正在编写一个linux内核模块,该模块在特定时间使用schedule_delayed_work调度任务,该特定时间又向用户空间程序发送信号以执行某项任务。 我所做的是手动给出时间(以毫秒为单位)(比如5000毫秒)并使用" msec改为jiffies"功能并测试并工作。
我的用例是用户将给出时间(比如说下午5点),并且模块必须安排它每天下午5点向用户程序发送信号。我完全不知道如何计算用户每天给定时间的毫秒数。
我使用workqueue创建队列,然后使用任务完成并进行调度。
我的内核模块:
static void wq_handler_function(struct work_struct *work);
static unsigned long delay;
static struct workqueue_struct *my_wq; // my workqueue
static DECLARE_DELAYED_WORK(my_work, wq_handler_function); //my work/task
static void wq_handler_function(struct work_struct *work)
{
printk(KERN_DEBUG "handler function called\n");
if(my_wq)
{
/*Do some work like sending signal to user space*/
schedule_delayed_work(&my_work, delay); /*reschedule after the first scheduled time finished*/
}
}
int sig_init_module(void)
{
printk(KERN_DEBUG "signal module initiated\n");
delay = msecs_to_jiffies(5000); //Manually given 5000ms (5 sec) for scheuling
if(!my_wq)
my_wq = create_workqueue("my_queue");
if(my_wq)
{
schedule_delayed_work(&my_work, delay); /*schedule for the first time while module initiates*/
}
return 0;
}
void sig_cleanup_module(void)
{
flush_scheduled_work();
cancel_delayed_work_sync(&my_work);
flush_workqueue(my_wq);
destroy_workqueue(my_wq);
printk(KERN_DEBUG "signal module removed\n");
}
module_init(sig_init_module);
module_exit(sig_cleanup_module);
请帮我解决这个问题。在此先感谢!!!。
答案 0 :(得分:3)
我不明白为什么内核修改是可取的或必要的。如果您想要定期完成某些操作(例如日志轮换),请将其添加到cron。另一种选择是使用timerfd。
答案 1 :(得分:-1)
在内核代码中使用mktime()函数,它将wall time作为参数并直接返回jiffies值。 有关mktime的信息,请参阅此http://www.makelinux.net/ldd3/chp-7-sect-2