测试环境:openEuler 22.03LTS x86
代码功能:调用内核kthread API创建一个内核线程,该线程每隔两秒打印一次,模块退出时停止内核线程,并输出退出信息。
源码如下:
// kthread_test.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sizes.h>
#include <linux/delay.h>
#include <linux/kthread.h>
struct task_struct *task = NULL;
// 内核线程的运行函数
int threadfn(void * data)
{
while(!kthread_should_stop()) { // 判读内核线程是否应该停止
msleep(2000);
printk(KERN_INFO "kthread_test is running!\n");
}
return 0;
}
static int __init kthread_test_init(void)
{
// 创建一个内核线程
task = kthread_create(threadfn, NULL, "kthread-testxxxxxxxxxx");
if (!IS_ERR(task)) {
printk(KERN_INFO "create thread success\n");
wake_up_process(task); // 启动内核线程
}
return 0;
}
static void __exit kthread_test_exit(void)
{
kthread_stop(task); // 停止内核线程
printk(KERN_INFO "kthread_test is stop!\n");
return;
}
module_init(kthread_test_init);
module_exit(kthread_test_exit);
MODULE_LICENSE("GPL");
Makefile如下:
obj-m+=kthread_test.o
CONFIG_MODULE_SIG=n
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
测试结果:
加载kthread_test.ko后,ps可以看到名称为kthread_testxxx的内核线程
dmesg查看内核日志信息
卸载内模块后可以看到输出线程停止信息