当前位置:首页>Linux>Linux 内核线程的创建

Linux 内核线程的创建

  • 2026-10-21 13:27:03
Linux 内核线程的创建
2026 速通Linux内核驱动(视频+答疑+开发板+就业指导)

一、创建一个内核线程

在linux内核中,无论是进程还是线程,都是用struct task_struct结构体来表示的。

structtask_struct*kthread_create(int(*threadfn)(void*data),
void*data,
constchar namefmt[]);
  • threadfn
     :将要去运行的函数实体;
  • data
     :传递给将要运行的函数的参数;
  • namefmt
     :是说创建的线程的名称;

使用 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;
}

最新文章

随机文章