在本项目中,我们将创建一个Linux内核模块,该模块会启动一个内核线程。这个线程将作为一个"看守者",每隔10秒打印一次自己的状态信息,包括线程ID、运行状态等。
技术点 | 说明 |
---|---|
内核线程创建 | 使用kthread_create()或kthread_run()函数创建内核线程 |
线程函数编写 | 实现线程的主要逻辑,包括循环和休眠 |
延时机制 | 使用msleep()或ssleep()实现线程休眠 |
状态信息获取 | 获取并打印线程的ID、名称、状态等信息 |
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/delay.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("内核线程看守者示例");
static struct task_struct *watchdog_thread;
// 线程函数
static int watchdog_thread_func(void *data)
{
while (!kthread_should_stop()) {
// 打印线程信息
printk(KERN_INFO "看门狗线程[%s] ID:%d 正在运行\n",
current->comm, current->pid);
// 休眠10秒
ssleep(10);
}
printk(KERN_INFO "看门狗线程退出\n");
return 0;
}
// 模块初始化函数
static int __init watchdog_init(void)
{
printk(KERN_INFO "初始化看门狗模块\n");
// 创建内核线程
watchdog_thread = kthread_create(watchdog_thread_func, NULL, "my_watchdog");
if (IS_ERR(watchdog_thread)) {
printk(KERN_ERR "无法创建看门狗线程\n");
return PTR_ERR(watchdog_thread);
}
// 唤醒线程
wake_up_process(watchdog_thread);
printk(KERN_INFO "看门狗线程已启动\n");
return 0;
}
// 模块退出函数
static void __exit watchdog_exit(void)
{
printk(KERN_INFO "卸载看门狗模块\n");
// 停止线程
if (watchdog_thread) {
kthread_stop(watchdog_thread);
printk(KERN_INFO "看门狗线程已停止\n");
}
}
module_init(watchdog_init);
module_exit(watchdog_exit);
obj-m := watchdog.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
make
命令编译模块sudo insmod watchdog.ko
加载模块dmesg
命令查看内核日志,确认线程已启动sudo rmmod watchdog
卸载模块printk
输出信息时要注意日志级别,避免产生过多日志