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;
}
为什么这只执行一次?
答案 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?的接受答案,以及我自己的一些问题,我怀疑有两个可能的原因:
您的函数返回。
您的主题状态为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;
}