我正在做一个学术项目,我必须了解 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 步”打印但我无法使用系统。我知道代码中可能存在初学者错误,但我无法对其进行个体化。谢谢大家的帮助。