gpt4 book ai didi

Linux - linux 内核模块中的控制流

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:05 24 4
gpt4 key购买 nike

我正在学习编写内核模块,在其中一个示例中,我必须确保一个线程执行 10 次并退出,所以我根据我所学的内容编写了这个:

#include <linux/module.h>
#include <linux/kthread.h>

struct task_struct *ts;
int flag = 0;
int id = 10;

int function(void *data) {
int n = *(int*)data;
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(n*HZ); // after doing this it executed infinitely and i had to reboot
while(!kthread_should_stop()) {
printk(KERN_EMERG "Ding");
}
flag = 1;
return 0;
}

int init_module (void) {
ts = kthread_run(function, (void *)&id, "spawn");
return 0;
}

void cleanup_module(void) {
if (flag==1) { return; }
else { if (ts != NULL) kthread_stop(ts);
}
return;
}

MODULE_LICENSE("GPL");

我想知道的是:a) 如何让线程像循环一样执行10次b) 控制在这些进程中是如何流动的,如果我们让它执行 10 次,那么它是否在 functioncleanup_moduleinit_module 或者到底发生了什么?

最佳答案

如果您使用 kthread_stop 控制 kthread,则 kthread 不应该退出直到被停止(另请参阅 answer)。因此,在执行完所有操作后,kthread 应该等待直到停止。

内核已经实现了kthread_worker机制,当kthread刚执行工作的时候,加入到它。

DEFINE_KTHREAD_WORKER(worker);

struct my_work
{
struct kthread_work *work; // 'Base' class
int n;
};

void do_work(struct kthread_work *work)
{
struct my_work* w = container_of(work, struct my_work, work);

printk(KERN_EMERG "Ding %d", w->n);

// And free work struct at the end
kfree(w);
}

int init_module (void) {
int i;
for(i = 0; i < 10; i++)
{
struct my_work* w = kmalloc(sizeof(struct my_work), GFP_KERNEL);
init_kthread_work(&w->work, &do_work);
w->n = i + 1;
queue_kthread_work(&worker, &w->work);
}
ts = kthread_run(&kthread_worker_fn, &worker, "spawn");
return 0;
}

void cleanup_module(void) {
kthread_stop(ts);
}

关于Linux - linux 内核模块中的控制流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32504532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com