一、代码
#include <linux/module.h> #include <linux/kernel.h> #include <linux/types.h> #include <linux/kthread.h> #include <linux/err.h> MODULE_VERSION("1.0.0_0"); MODULE_LICENSE("GPL"); MODULE_AUTHOR("gwy"); #ifndef SLEEP_MILLI_SEC #define SLEEP_MILLI_SEC(nMilliSec) \ do { \ long timeout = (nMilliSec) * HZ /1000; \ while (timeout > 0) \ { \ timeout = schedule_timeout(timeout); \ } \ }while (0); #endif struct task_struct* thread = NULL; void thread_proc(void* arg) { struct timespec ts; //set_current_state(TASK_UNINTERRUPTIBLE); while(!kthread_should_stop()) { ts = current_kernel_time(); printk("thread_proc:%s. time:%ld\n", (char*)arg, ts.tv_sec); SLEEP_MILLI_SEC(1000); } } static int init_marker(void) { int err; printk("init marker.\n"); thread = kthread_create(thread_proc, "thread arg", "my_thread%d", 0); if (IS_ERR(thread)) { err = PTR_ERR(thread); printk("kthread_create fail.\n"); return err; } wake_up_process(thread); printk("thread create.\n"); return 0; } static void exit_marker(void) { if (thread) { kthread_stop(thread); thread = NULL; printk("thread stop.\n"); } printk("exit marker.\n"); } module_init(init_marker); module_exit(exit_marker);
二、输出结果
三、注意
1)在调用kthread_stop函数时,线程函数不能已经运行结束。否则,kthread_stop函数会一直进行等待。
2)线程函数必须能让出CPU,以便能运行其他线程。 同时线程函数也必须能重新被调度运行。
3)注意线程函数的使用,参见“kthread_create的简单使用”。
参考资料:
kthread_create的简单使用:http://blog.csdn.net/newnewman80/article/details/7050090
kthread_create与kerne_thread的区别:http://blog.sina.com.cn/s/blog_5a1e1b770100jfc0.html