在用户提供的时间每天在Linux内核模块中调度任务

我正在编写一个linux内核模块,它在特定的时间使用schedule_delayed_work来调度任务,然后发送一个信号给用户空间程序来完成一些任务。 我所做的是手动给出毫秒(例如5000毫秒)的时间,并使用“msec to jiffies”函数将其更改为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 calledn");
       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 initiatedn");
       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 removedn");
     }

     module_init(sig_init_module);
     module_exit(sig_cleanup_module);

请帮我解决这个问题。 提前致谢!!!。


我不明白为什么内核修改将是可取或必需的。 如果你想定期完成一些事情(例如日志轮转),将它添加到cron中。 另一种选择是使用timerfd。


在内核代码中使用mktime()函数,将墙壁时间作为参数并直接返回jiffies值。 有关mktime的信息,请参阅http://www.makelinux.net/ldd3/chp-7-sect-2

链接地址: http://www.djcxy.com/p/87889.html

上一篇: scheduling tasks in linux kernel module everyday at a user provided time

下一篇: Undefined function inserting new module in kernel linux