内核线程创建

 

#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来决定

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值