首页 > 解决方案 > 如何唤醒等待队列中的内核进程

问题描述

我很难理解等待队列在 Linux 内核中是如何工作的,我尝试实现一个简单的等待队列示例,但尝试失败。我知道在使用时wait_event_interruptible(w, condition),进程会进入睡眠状态(TASK_INTERRUPTIBLE),直到条件评估为true

我不明白这两件事是如何工作的。

我们如何在进程完全进入睡眠状态后唤醒它?

此代码进入睡眠状态,永远不会醒来。

#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

标签: clinux-kernelkernel-module

解决方案


推荐阅读