1

カーネル用のモジュールを書いています。何かをテストするだけで、プロセスをしばらく (たとえば、20 秒) 待つ必要があります。プロセスは 20 秒後に続行されます。私のmodule_init関数では、次のようにタイマーを使用しました:

init_timer(&timer);
timer.expires = jiffies + HZ*20;//timer expires in delay ticks
timer.data = 0;//zero is passed to the timer handler
timer.function = timer_handle;//function to run when timer expires  

「タイマー」はそのように定義された構造体です

static struct timer_list timer;

timer_handle は、タイマーの有効期限が切れたときに実行する関数です。

void timer_handle (unsigned long data){


 }

今私の機能で:

ssize_t write(struct file *filp, const char *buff, size_t count, loff_t *offp) { 
    unsigned long ret;


    printk(KERN_INFO "pid : .%d  \n", task->pid);
    down_write(&rwsem);
    if ( (filp->f_flags & O_ACCMODE) == O_RDONLY)
    {
        printk(KERN_INFO "The reader thread is not able to write. \n");
        return -EINVAL;
    }
    printk(KERN_INFO "Inside write 1 \n");
    add_timer(&timer);
    ret = copy_from_user(bufferr, buff, count);
    up_write(&rwsem);
    printk("Inside write 2 \n");
    return count;
}

「printk(KERN_INFO "Inside write \n");」の後 プロセスを20秒間待機させたい。メッセージ「Inside write 2 \n」は、メッセージ「Inside write 1 \n」が書き込まれた 20 秒後に書き込まれる必要があります。add_timer(&timer); を使用しました。それらの間ですが、機能しません。ターミナルで「dmesg」と入力すると、メッセージがすぐに連続して書き込まれます。

私の問題を明確に説明したいと思います:)誰か助けてくれませんか?

4

2 に答える 2

2

2 つのメッセージは、すぐに連続するため、すぐ連続して書き込まれます。遅延ではなくタイマーをプログラミングしているため、20 秒後にカーネルがtimer_handle()関数を実行します。この場合は空です。

コードの実行を遅らせる必要がある場合は、Linux Device Driver 3th Chapter 7 section 3をお読みください。

于 2012-08-05T16:52:05.120 に答える
1

ユーザーが読み取りをトリガーしたときの書き込みコールバックであるため、間違って印刷しています。

いつタイマーを登録しますか? なぜあなたが書いているのか理解できませんでした。

そのタイマーは、定期的に、または何らかのイベントトリガーに基づいてタイマーを設定する必要がありますか?

于 2013-03-13T13:02:58.147 に答える