c - 如何唤醒等待队列中的内核进程
问题描述
我很难理解等待队列在 Linux 内核中是如何工作的,我尝试实现一个简单的等待队列示例,但尝试失败。我知道在使用时wait_event_interruptible(w, condition)
,进程会进入睡眠状态(TASK_INTERRUPTIBLE
),直到条件评估为true
。
我不明白这两件事是如何工作的。
condition
每次waitqueue wq
唤醒时都会检查。wake_up
必须在更改任何可能更改等待条件结果的变量后调用。
我们如何在进程完全进入睡眠状态后唤醒它?
此代码进入睡眠状态,永远不会醒来。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
// Declare the wait queue with a macro
DECLARE_WAIT_QUEUE_HEAD(wait_queue_t);
// Variables
int i = 5;
static void change_val(int *i)
{
*i = 4;
}
static int __init sys_module_init(void)
{
wait_event_interruptible(wait_queue_t, (i == 4)); // Sleeping until "i" is equal to 4
change_val(&i); // Changing the value of "i"
wake_up(&wait_queue_t); // Waking up the wait_queue
return 0;
}
// ... other kernel module code
解决方案
推荐阅读
- javascript - 如何嵌入用户需求?
- pdf - 连接 PDF 时构建 TOC
- javascript - 邮政编码只输入数字(限制 5 个) l Angular 4/5
- javascript - 全屏无法在 Safari 中运行
- google-cloud-dataflow - Spanner 中的查询计划
- android - 在底表打开后调整 Recyclerview 高度会导致项目之间的间隙
- android - ListView 并选择一个位置
- angular - Access-Control-Allow-Origin 角度
- docker - Docker Swarm - 是否可以限制网络访问工作人员?
- javascript - 全日历 | 视图更改后 Jquery 悬停功能不再起作用