2016-11-08 9 views
0

私は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); 

は親切に、このためのソリューションを持っている私を助けて。前もって感謝します!!!。

+2

この種のタスクは通常、カーネルではなくユーザー空間で行われます。なぜこれを処理するカーネルモジュールを書こうとしていますか? – duskwuff

+0

これをユーザ空間@duskwuffに実装する方法を教えてください。 –

+0

これをカーネルモジュールとして書こうとしている理由を説明できますか?それなしでそれをすることは不可能だとあなたは信じますか? – duskwuff

答えて

3

なぜカーネルの変更が望ましいか、必要なのか分かりません。定期的に何か(例えばログのローテーション)が必要な場合は、cronに追加してください。別のオプションはtimerfdを使うことです。

+0

これは、実際には、顧客からのアンドロイドアプリケーションからユーザーの時間を取得し、それを保存して、インテルがユーザー空間で何らかのコードを呼び出すようなlinuxを実行している組み込みシステムのタスクをスケジュールします。 –

+2

カーネルの変更がどのように使われているかはまだ分かりません。リブートがあればどうなりますか?データはどこに保存しますか?ユーザー空間デーモンを作成して、そのアプリケーションとの対話を例えばUnixソケット。 –

+0

一部のポートでリッスンするRESTfulなサーバーと、別のポートで別のTCPコードを使用しています。そのRESTfulなサーバーから、IPとポート番号を使用してユーザーの所与の時間が受信され、TCPコードに転送されます。 –

-1

は、引数としてウォールタイムをとり、jiffies値を直接返すカーネルコードでmktime()関数を使用します。 mktimeについての情報はこちらhttp://www.makelinux.net/ldd3/chp-7-sect-2

+0

私はmktime()がjiffiesの値ではなくエポックの時刻を返すと思います@ user_3093890 –

関連する問題