为什么我的内核线程只执行一次?

时间:2013-03-07 20:30:14

标签: c linux linux-kernel

following this post我在我的内核模块中实现了:

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

在init中:

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;
}

为什么这只执行一次?

2 个答案:

答案 0 :(得分:1)

这是任何线程的正常行为。如果您想要一个周期性行为,则需要thread_fn中的循环 这是内核线程的一个很好的文档:https://prof.hti.bfh.ch/myf1/adv-linux/courseNotes/kthread-intro-1.2.pdf

答案 1 :(得分:1)

基于How to stop Linux kernel threads on rmmod?的接受答案,以及我自己的一些问题,我怀疑有两个可能的原因:

  1. 您的函数返回。

  2. 您的主题状态为TASK_INTERRUPTIBLE,因此对schedule()的调用永远不会返回。

  3. 如果您将主体包裹在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;
    }