#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/delay.h>
static int test_func (void *name){
int i = 0;
while (1){
printk("test_func of %s entry\n", (char *)name);
//for(i=0;i++;i<20){
msleep(1500);
//}
}
return 0;
}
static int create_thread (void) {
struct task_struct *p =NULL;
int rc = 0;
p = kthread_create(test_func,"kthread_create","kthread_create");
if (IS_ERR(p))
{
rc = PTR_ERR(p);
printk(" error %d create thread_name thread", rc);
}
kthread_bind(p,1); //这里是绑定CPU1上哦,
wake_up_process(p); //这里需要wakeup ,线程才开始执行
return 0;
}
static int create_thread_simple (void) {
struct task_struct *p =NULL;
int rc = 0;
p = kthread_run(test_func, "kthread_run ","kthread_run");
if (IS_ERR(p))
{
rc = PTR_ERR(p);
printk(" error %d create thread_name thread", rc);
}
return 0;
}
static int __init test_register(void)
{
int pid;
create_thread();
create_thread_simple();
pid = kernel_thread(test_func, "kernel_thread create", CLONE_FS | CLONE_FILES);
return 0;
}
static void __exit test_unregister(void)
{
printk("print %s entry\n", __func__);
return;
}
module_init(test_register);
module_exit(test_unregister);
MODULE_LICENSE("GPL");
1.create_thread
绑定好了后怎么查看工作是否生效了呢? 可以命令
taskset -c -p <pid>
$ taskset -c -p 332
pid 5357's current affinity list: 2 //这里2就是CPU1, 对应1就是CPU0
2. kthread_run
还有一种简单的创建方法,下面这种方法不需要wakeup就直接运行,所以就无法绑定到某个CPU了
3. 古老的接口 kernel_create和daemonize
将一个函数传递给kernel_thread创建并初始化一个task,该函数接下来负责帮助内核调用daemonize已转换为内核守护进程,daemonize随后完成一些列操作, 如该函数释放其父进程的所有资源,不然这些资源会一直锁定直到线程结束。阻塞信号的接收, 将init用作守护进程的父进程
kthread_create是通过work_queue来实现的,kernel_thread是通过_do_fork来实现的。
kernel_thread函数的作用是产生一个新的线程
内核线程实际上就是一个共享父进程地址空间的进程,它有自己的系统堆栈.
内核线程和进程都是通过do_fork()函数来产生的,系统中规定的最大进程数与
线程数由fork_init来决定