
在linux内核中,无论是进程还是线程,都是用struct task_struct结构体来表示的。
structtask_struct*kthread_create(int(*threadfn)(void*data),
void*data,
constchar namefmt[]);
threadfndatanamefmt
使用 kthread_create()接口所创建的线程,并不会马上运行的,而是将其放到了等待队列中去了。如果想要让创建的线程马上运行的话,使用 wake_up_process(struct task_struct *task)函数将所创建的线程马上唤醒。
structtask_struct*kthread_run(int(*kthreadfn)(void*data),
void*data,
constchar namefmt[]);
其本质上来说,kthread_run()函数其实是一个宏定义:
#definekthread_run(int(*kthreadfn)(void*data),\
void*data,\
constchar namefmt[])\
({\
structtask_struct*kthread =kthread_create( kthread, data, namefmt[]);\
if(!IS_ERR(kthread))\
wake_up_process(kthread);\
kthread;\
})所以 kthread_run()函数的返回值:
1、创建task_struct类型变量
staticstructtask_struct*tsk;
2、为了保证此线程不能反复创建做如下处理:
if(tsk ==NULL){
tsk =kthread_run(AutoScan,NULL,"AutoScan");
}else{
kthread_stop(tsk);
tsk =kthread_run(AutoScan,NULL,"AutoScan");
}
3、当进程还没有结束时,又一次搜台动作进来,那么就kthread_stop(tsk);关掉线程,重新创建。
4、判断线程是否已停止
if(kthread_should_stop()){
break;
}