私はLinuxカーネルモジュールを作成しています。これは特定の時間にschedule_delayed_workを使ってタスクをスケジューリングし、ユーザー空間プログラムに信号を送ります。 私がしたことは手動でミリ秒(例えば5000ms)で時間を与え、 "msec to jiffies"関数を使ってjiffiesに変更し、テストして作業しました。ユーザが提供した時刻に毎日Linuxカーネルモジュールのタスクをスケジュールする
私の使用例は、ユーザーが時間(午後5時)を与え、モジュールが毎日午後5時にユーザープログラムに信号を送信するようにスケジュールする必要があるということです。私は、日常的な時間のために与えられた時間からミリ秒を計算する方法に完全に混乱しています。
ワークキューを使用してキューを作成し、スケジューリングを実行してタスクを実行しました。
私のカーネルモジュール:
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);
は親切に、このためのソリューションを持っている私を助けて。前もって感謝します!!!。
この種のタスクは通常、カーネルではなくユーザー空間で行われます。なぜこれを処理するカーネルモジュールを書こうとしていますか? – duskwuff
これをユーザ空間@duskwuffに実装する方法を教えてください。 –
これをカーネルモジュールとして書こうとしている理由を説明できますか?それなしでそれをすることは不可能だとあなたは信じますか? – duskwuff