我正在从事一个嘉奖项目,我必须了解linux工作队列的用法。出于这个原因,我开发了一个小模块,它只需在1000 jiffies之后调度自定义工作队列上工作的执行。但是,当超时过期时,系统会被阻塞,我需要重新启动VM,并且我无法收集任何用于调试的信息。
下面是我正在使用的代码的部分:
static void enqueue_message(struct work_struct *work){
printk("%s: Step 2\n", MODULE_NAME);
return;
}
int init_module(void){
struct workqueue_struct *workqueue;
struct delayed_work deferred_write;
workqueue = alloc_workqueue("pending_writes",WQ_MEM_RECLAIM, 0);
INIT_DELAYED_WORK(&deferred_write, enqueue_message);
queue_delayed_work(workqueue, &deferred_write, 1000);
printk("%s: Step 1\n", MODULE_NAME);
return 0;
}如果我很快(在计时器到期之前)请求shell上的“dmesg”,我可以读取“步骤1”打印,但是我不能使用系统。我知道在代码中可能有一个初学者的错误,但我不能个性化。谢谢大家的帮助。
发布于 2020-02-19 20:50:03
与Linux内核中的许多其他函数一样,queue_delayed_work希望它的参数是exist,直到工作被触发为止。
但是,您传递函数一个局部变量 (deferred_write) --当init_module函数返回时,已被销毁。
使用全局变量代替。
https://stackoverflow.com/questions/60305511
复制相似问题