进程与内存2-内核线程应用(简单实例)

本文通过简单的实例介绍了如何在Linux内核中创建线程,包括使用kernel_thread()和kthread_create()函数,并提及了使用fifo调度策略的实时线程。循环打印的次数可自定义,为读者提供了动手实践的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个节是建立内核线程的例子(linux-3.2.36)

就是循环打印,有几个宏我说明一下

KERNEL_THREAD: 用kernel_thread()建立线程

KTHREAD_CREATE: 用kthread_create()建立线程

REALTIME_THREAD:使用fifo调度策略

CNT:打印的次数,自己玩玩吧,不多说了。


#include <linux/sched.h>
#include <linux/module.h>

//#define KERNEL_THREAD

#ifndef KERNEL_THREAD
#define KTHREAD_CREATE
#endif

#define REALTIME_THREAD

#ifdef KERNEL_THREAD
#include <asm/processor.h>
#include <linux/completion.h>
#endif

#ifdef KTHREAD_CREATE
#include <linux/kthread.h>
#endif

#define CNT 5

MODULE_LICENSE("GPL");

static int i = 0;

#ifdef KERNEL_THREAD
static DECLARE_COMPLETION(my_completion);
#endif

#ifdef KTHREAD_CREATE
static struct task_struct *thread_task = NULL;
#endif

static int noop(void *dummy)
{
    printk("Thread start!\n");
#ifdef RELTIME_THREAD
    struct sched_param param = {.sched_priority = 99};
    sched_setscheduler(current, SCHED_FIFO, ¶m);
#endif

#ifdef KERNEL_THREAD
    daemonize("mythread");
#endif

    do
    {
        printk("current->mm = %p\n", current->mm);
        printk("current->active_mm = %p\n", current->active_mm);
        set_current_state(TASK_INTERRUPTIBLE);
        if (i < CNT)
        {
            schedule_timeout(10 * HZ);
        }
        i++;
    }while(i < CNT);

    set_current_state(TASK_RUNNING);

#ifdef KERNEL_THREAD
    complete(&my_completion);
#endif 

    return 0;
}

static int __init test_init(void)
{
    i = 0;
#ifdef KERNEL_THREAD
    kernel_thread(noop, NULL, CLONE_KERNEL | SIGCHLD);
#endif

#ifdef KTHREAD_CREATE
    thread_task =  kthread_create(noop, NULL, "my_thread");
    wake_up_process(thread_task);
    //thread_task->state = TASK_RUNNING;
#endif

    return 0;
}

static void __exit test_exit(void)
{
    i = CNT;
#ifdef KERNEL_THREAD
    wait_for_completion(&my_completion);
#endif

#ifdef KTHREAD_CREATE
    if (thread_task != NULL)
    {        
        wake_up_process(thread_task);
        kthread_stop(thread_task);
        //yield();
    }
#endif 
}

module_init(test_init);
module_exit(test_exit);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值