linux - 安排延迟工作时系统阻塞
问题描述
我正在做一个学术项目,我必须了解 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 步”打印但我无法使用系统。我知道代码中可能存在初学者错误,但我无法对其进行个体化。谢谢大家的帮助。
解决方案
与 Linux 内核中的许多其他函数一样,queue_delayed_work
它期望其参数存在,直到工作被触发。
但是,您向函数传递了一个局部变量( ) -当函数返回时deferred_write
,该变量已被销毁。init_module
改用全局变量。
推荐阅读
- angular - 如何在rxjs中使用循环中的两个可观察函数?
- c# - 如何在 .NET Core 中执行多个任务,并检查哪些任务成功完成
- typescript - 是否可以在 Ionic 中“切片”模态?
- java - 这是从 Firebase 检索数据的正确方法吗?
- jupyter-notebook - pandoc 的 --webtex 的独立替代品
- google-maps - KML:将图标放在地标中而不是样式中
- r - R 和本地时间的 POSIXct 中缺少时区值
- c# - 在 TRX 结果文件中显示单元测试文件名
- java - SQS Java 客户端异常 - com.amazonaws.SdkClientException:无法执行 HTTP 请求:权限被拒绝:连接
- r - spread() 正在产生 NA 值。(R 编程)