1

この投稿に続いて、カーネルモジュールに実装しました:

static int val = 1;
static char thread_name[128] = "my thread name";

初期で:

thread1 = kthread_run(thread_fn, &val, thread_name);

そしてこれが関数です

int thread_fn(void *data)
{
    unsigned long j0,j1;
    int delay = 60*HZ;
    j0 = jiffies; 
    j1 = j0 + delay; 

    printk(KERN_INFO "here");

    while (time_before(jiffies, j1)) 
        schedule();
    return 1;
}

これが 1 回しか実行されないのはなぜですか?

4

2 に答える 2

1

rmmod で Linux カーネル スレッドを停止する方法に対する受け入れられた回答に基づいていますか? 、および私自身の突っ込みのいくつかは、2つの考えられる原因があると思われます。

  1. 関数が返されます。

  2. あなたのスレッドの状態はTASK_INTERRUPTIBLEであるため、 への呼び出しschedule()は返されません。

本体をwhile (! kthread_should_stop() )ループでラップし、タスクがTASK_RUNNINGへの呼び出し前の状態であることを確認するschedule()と、実行が継続されます。

int thread_fn(void *data)
{
    unsigned long j1;
    int delay = 5*HZ;  /* use a 5-second delay instead of a 60-sec one */

    int count = 0;
    while (! kthread_should_stop() ) {
        j1 = jiffies + delay; 

        printk(KERN_INFO "here %d\n", ++count);

        while (time_before(jiffies, j1)) {
            set_current_state(TASK_RUNNING);
            schedule();
        }
    }
    return 1;
}
于 2013-03-07T20:51:55.513 に答える