参考
tasklet
软中断中执行,当tasklet在执行的时候,不会重复进入。
worker工作队列
可重复进入。
内核线程
内核线程函数体常用循环控制条件,其中signal_pending
用来接收kill -SIGKILL <pid>
,kthread_should_stop
用来接收kthread_stop
,
#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/delay.h>
static struct task_struct * slam_thread = NULL;
static int is_signal_exited = 0;
static int func(void *data)
{
allow_signal(SIGKILL);
mdelay(1000);
while(!signal_pending(current) && !kthread_should_stop()) {
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(msecs_to_jiffies(5000));
}
is_signal_exited = 1;
return 0;
}
static __init int kthread_signal_example_init(void)
{
slam_thread = kthread_run(func, NULL, "slam");
return 0;
}
static __exit void kthread_signal_example_exit(void)
{
if(!is_signal_exited && !IS_ERR(slam_thread))
kthread_stop(slam_thread);
}
module_init(kthread_signal_example_init);
module_exit(kthread_signal_example_exit);