内核线程创建

 

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

 

内核线程创建Socket有四个主要步骤:socket、bind、listen、accept。首先,使用socket系统调用创建一个Socket对象,该对象将用于后续的通信。接下来,使用bind系统调用将Socket绑定到本地地址和指定的端口号上。然后,使用listen系统调用将Socket设置为监听模式,使其能够接受传入的连接请求。最后,使用accept系统调用在等待队列中等待连接请求的到来,并将连接成功后的Socket分发到不同的线程上进行处理。通过这种方式,内核线程能够有效地利用多核能力,提高连接成功后的Socket分发能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [linux内核线程socket,从Linux源码看Socket(TCP)的accept](https://blog.csdn.net/weixin_34207880/article/details/116684162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [linux之socket创建内核结构](https://blog.csdn.net/qq_26105397/article/details/127339757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值