Linux内核 -- 多线程之kthread的使用

在 Linux 内核中创建并使用内核线程

本文档介绍如何在 Linux 内核中创建并使用一个内核线程(kthread)。

定义线程函数

线程函数是内核线程运行时执行的函数。它通常是一个无限循环,直到某种条件使其退出。

c 复制代码
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/module.h>

static struct task_struct *thread_st;

static int thread_fn(void *data) {
    while (!kthread_should_stop()) {
        pr_info("Thread is running\n");
        ssleep(5); // Sleep for 5 seconds
    }
    pr_info("Thread is stopping\n");
    return 0;
}

创建和启动内核线程

你可以在模块初始化函数中创建并启动内核线程。

c 复制代码
static int __init init_thread(void) {
    pr_info("Creating thread\n");
    thread_st = kthread_create(thread_fn, NULL, "my_thread");
    if (thread_st) {
        wake_up_process(thread_st);
    } else {
        pr_err("Thread creation failed\n");
    }
    return 0;
}

停止内核线程

在模块退出函数中停止并清理内核线程。

c 复制代码
static void __exit cleanup_thread(void) {
    if (thread_st) {
        kthread_stop(thread_st);
        pr_info("Thread stopped\n");
    }
}

模块初始化和清理函数

定义模块的初始化和清理函数,并注册为内核模块。

c 复制代码
module_init(init_thread);
module_exit(cleanup_thread);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple example of creating a kthread");

完整代码

c 复制代码
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/module.h>

static struct task_struct *thread_st;

static int thread_fn(void *data) {
    while (!kthread_should_stop()) {
        pr_info("Thread is running\n");
        ssleep(5); // Sleep for 5 seconds
    }
    pr_info("Thread is stopping\n");
    return 0;
}

static int __init init_thread(void) {
    pr_info("Creating thread\n");
    thread_st = kthread_create(thread_fn, NULL, "my_thread");
    if (thread_st) {
        wake_up_process(thread_st);
    } else {
        pr_err("Thread creation failed\n");
    }
    return 0;
}

static void __exit cleanup_thread(void) {
    if (thread_st) {
        kthread_stop(thread_st);
        pr_info("Thread stopped\n");
    }
}

module_init(init_thread);
module_exit(cleanup_thread);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple example of creating a kthread");

这段代码展示了如何在内核模块中创建和使用一个内核线程。初始化模块时,线程被创建并启动,运行时每隔5秒打印一次信息。在模块卸载时,线程被停止并清理。

相关推荐
大地的一角2 分钟前
(Linux)进程间通信
linux·运维·服务器
weixin_462446234 分钟前
【原创实践】在 CentOS 上安装 JupyterHub 并配置 R 语言支持 Kernel
linux·r语言·centos
零基础的修炼11 分钟前
Linux网络---UDP原理
linux·网络·udp
苏宸啊8 小时前
Linux权限
linux·运维·服务器
xqhoj9 小时前
Linux——make、makefile
linux·运维·服务器
张童瑶9 小时前
Linux 在线安装编译Python3.11
linux·运维·python3.11
Shi_haoliu9 小时前
SolidTime 在 Rocky Linux 9.5 上的完整部署流程
linux·运维·nginx·postgresql·vue·php·laravel
Lkygo10 小时前
LlamaIndex使用指南
linux·开发语言·python·llama
qq_2546177710 小时前
nslookup 这个命令解析dns,和系统接口gethostbyname解析区别在哪?
linux·网络
HIT_Weston11 小时前
100、【Ubuntu】【Hugo】搭建私人博客:元信息&翻译(一)
linux·运维·ubuntu