相关函数:
kthread_create():创建内核线程
kthread_run():创建并启动线程的函数。
({ /
struct task_struct *__k /
= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); /
if (!IS_ERR(__k)) /
wake_up_process(__k); /
__k; /
})
</div>
kthread_stop():通过发送信号给线程,使之退出。
同时,在调用kthread_stop函数时,线程函数不能已经运行结束。否则,kthread_stop函数会一直进行等待。
内核线程的一般框架
int threadfunc(void *data){
…
while(1){
set_current_state(TASK_UNINTERRUPTIBLE);
if(kthread_should_stop()) break;
if(){//条件为真
//进行业务处理
}
else{//条件为假
//让出CPU运行其他线程,并在指定的时间内重新被调度
schedule_timeout(HZ);
}
}
…
return 0;
}
线程相关测试命令
可以使用top命令来查看线程(包括内核线程)的CPU利用率。命令如下:
top –p 线程号
可以使用下面命令来查找线程号:
ps aux|grep 线程名
示例程序:使用模块加载内核线程,实现每1s在内核中打印字符。
(makefile略去,和以前一篇博文一样的写法。)
static struct task_struct *my_task = NULL;
static int my_kthread(void *data)
{
char *mydata = kmalloc(strlen(data)+1,GFP_KERNEL);
memset(mydata,'\0',strlen(data)+1);
strncpy(mydata,data,strlen(data));
while(!kthread_should_stop())
{
SLEEP_MILLI_SEC(1000);
printk("%s\n",mydata);
}
kfree(mydata);
return 0;
}
static int __init kernel_thread_init(void)
{
int err;
printk(KERN_ALERT "Kernel thread initalizing...\n");
my_task = kthread_create(my_kthread,"hello world","mythread");
if(IS_ERR(my_task)){
printk("Unable to start kernel thread./n");
err = PTR_ERR(my_task);
my_task = NULL;
return err;
}
wake_up_process(my_task);
return 0;#include <