在 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秒打印一次信息。在模块卸载时,线程被停止并清理。