转自:http://blog.csdn.net/guowenyan001/article/details/39230181

一、代码

  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/types.h>
  4. #include <linux/kthread.h>
  5. #include <linux/err.h>
  6. MODULE_VERSION("1.0.0_0");
  7. MODULE_LICENSE("GPL");
  8. MODULE_AUTHOR("gwy");
  9. #ifndef SLEEP_MILLI_SEC
  10. #define SLEEP_MILLI_SEC(nMilliSec) \
  11. do { \
  12. long timeout = (nMilliSec) * HZ /1000; \
  13. while (timeout > 0) \
  14. { \
  15. timeout = schedule_timeout(timeout); \
  16. } \
  17. }while (0);
  18. #endif
  19. struct task_struct* thread = NULL;
  20. void thread_proc(void* arg)
  21. {
  22. struct timespec ts;
  23. //set_current_state(TASK_UNINTERRUPTIBLE);
  24. while(!kthread_should_stop())
  25. {
  26. ts = current_kernel_time();
  27. printk("thread_proc:%s. time:%ld\n", (char*)arg, ts.tv_sec);
  28. SLEEP_MILLI_SEC(1000);
  29. }
  30. }
  31. static int init_marker(void)
  32. {
  33. int err;
  34. printk("init marker.\n");
  35. thread = kthread_create(thread_proc, "thread arg", "my_thread%d", 0);
  36. if (IS_ERR(thread))
  37. {
  38. err = PTR_ERR(thread);
  39. printk("kthread_create fail.\n");
  40. return err;
  41. }
  42. wake_up_process(thread);
  43. printk("thread create.\n");
  44. return 0;
  45. }
  46. static void exit_marker(void)
  47. {
  48. if (thread)
  49. {
  50. kthread_stop(thread);
  51. thread = NULL;
  52. printk("thread stop.\n");
  53. }
  54. printk("exit marker.\n");
  55. }
  56. module_init(init_marker);
  57. module_exit(exit_marker);

二、输出结果

Linux内核:kthread_create(线程)、SLEEP_MILLI_SEC-LMLPHP

三、注意

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

04-15 16:23