Chinaunix首页 | 论坛 | 博客
  • 博客访问: 580282
  • 博文数量: 353
  • 博客积分: 1104
  • 博客等级: 少尉
  • 技术积分: 1457
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 23:02
个人简介

1、刚工作时做Linux 流控;后来做安全操作系统;再后来做操作系统加固;现在做TCP 加速。唉!没离开过类Unix!!!但是水平有限。。

文章存档

2015年(80)

2013年(4)

2012年(90)

2011年(177)

2010年(1)

2009年(1)

分类: LINUX

2011-10-26 16:37:59

开启linux 内核线程

http://blog.csdn.net/sealyao/article/details/4758827

函数说明:

 

kthread_create:创建线程。

struct task_struct *kthread_create(int (*threadfn)(void *data),void *data,const char *namefmt, ...);

线程创建后,不会马上运行,而是需要将kthread_create() 返回的task_struct指针传给wake_up_process(),然后通过此函数运行线程。

 

kthread_run :创建并启动线程的函数:

struct task_struct *kthread_run(int (*threadfn)(void *data),void *data,const char *namefmt, ...);

kthread_stop:通过发送信号给线程,使之退出。

int kthread_stop(struct task_struct *thread);
线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数,或者其他的进程调用kthread_stop函数,结束线程的运行。

但如果线程函数正在处理一个非常重要的任务,它不会被中断的。当然如果线程函数永远不返回并且不检查信号,它将永远都不会停止。

 

 

 

代码:

 

  1. #include   
  2. #include   
  3.   
  4. #ifndef SLEEP_MILLI_SEC     
  5. #define SLEEP_MILLI_SEC(nMilliSec)/  
  6. do { /  
  7. long timeout = (nMilliSec) * HZ / 1000; /  
  8. while(timeout > 0) /  
  9. { /  
  10. timeout = schedule_timeout(timeout); /  
  11. } /  
  12. }while(0);  
  13. #endif  
  14.   
  15.   
  16. static struct task_struct * MyThread = NULL;  
  17. static int MyPrintk(void *data)  
  18. {  
  19.     char *mydata = kmalloc(strlen(data)+1,GFP_KERNEL);  
  20.     memset(mydata,'/0',strlen(data)+1);  
  21.     strncpy(mydata,data,strlen(data));  
  22.     while(!kthread_should_stop())  
  23.     {  
  24.         SLEEP_MILLI_SEC(1000);  
  25.         printk("%s/n",mydata);  
  26.     }  
  27.     kfree(mydata);  
  28.     return 0;  
  29. }  
  30.   
  31.   
  32. static int __init init_kthread(void)  
  33. {  
  34.     MyThread = kthread_run(MyPrintk,"hello world","mythread");  
  35.     return 0;  
  36. }  
  37.   
  38. static void __exit exit_kthread(void)  
  39. {  
  40.     if(MyThread)  
  41.     {  
  42.         printk("stop MyThread/n");  
  43.         kthread_stop(MyThread);  
  44.     }  
  45. }  
  46.   
  47. module_init(init_kthread);  
  48. module_exit(exit_kthread);  
  49.   
  50.   
  51. MODULE_AUTHOR("YaoGang");  

这个内核线程的作用就是每隔一秒打印一个“hello world”。

值得一提的是kthread_should_stop函数,我们需要在开启的线程中嵌入该函数,否则kthread_stop是不起作用的。

阅读(434) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~