我正在帮助某人解决为什么内核模块工作线程在模块退出时没有正确停止的问题。我以前从未做过任何模块开发,所以我创建了一个 hello world 示例来进行故障排除,但没有成功。下面是一个简单模块的代码,它产生一个线程,然后阻塞在一个互斥锁上。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/slab.h>
#include <linux/sched/signal.h>
#include <linux/semaphore.h>
struct semaphore mutex;
struct task_struct *sample_thread_handle = NULL;
int sample_thread(void *arg)
{
printk(KERN_INFO "Starting Thread...");
while(!kthread_should_stop())
{
if(down_interruptible(&mutex)) {break;}
}
printk(KERN_INFO "Leaving Thread...");
return 0;
}
static int __init my_module_init(void) {
printk(KERN_INFO "Hello, world!\n");
sema_init(&mutex,1);
down(&mutex); // grab the mutext to keep the thread from exiting
sample_thread_handle = kthread_run(sample_thread,NULL,"sample thread");
return 0;
}
static void __exit my_module_exit(void)
{
printk(KERN_INFO "stopping sample thread\n");
kthread_stop(sample_thread_handle);
printk(KERN_INFO "after stopping consumer thread\n");
printk(KERN_INFO "Goodbye, world!\n");
}
module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your name");
MODULE_DESCRIPTION("A simple kernel module");
MODULE_VERSION("0.1");
初始化抢锁模拟工作线程在关闭时被阻塞在mutex上。从示例来看,尝试使用
down_interruptible(&mutex)
调用获取锁的线程应该允许它被 kthread_stop
方法中断,但我一定是误会了什么。任何朝着正确方向的推动将不胜感激。