📄 wait.h.txt
字号:
定义了等待队列的两个结构(wait_queue_t和wait_queue_head_t)以及一系列的初始化和操作函数。
struct __wait_queue {
unsigned int flags;
#define WQ_FLAG_EXCLUSIVE 0x01
struct task_struct * task; //在该队列上等待的进程
struct list_head task_list; //双向指针队列,构成等待队列的基础
#if WAITQUEUE_DEBUG
long __magic; //?
long __waker; //?
#endif
};
typedef struct __wait_queue wait_queue_t;
struct __wait_queue_head {
wq_lock_t lock;
struct list_head task_list; //双向指针队列
#if WAITQUEUE_DEBUG
long __magic;
long __creator;
#endif
};
typedef struct __wait_queue_head wait_queue_head_t;
注意:wait_queue_head_t和wait_queue_t的区别是,一般来说,如果一个结构想使用等待队列,首先他必须声明一个wait_queue_head_t的变量作为开始,每一个等待进程都装入到一个wait_queue_t型的变量中的task中去,然后将该wait_queue_t变量连接到wait_queue_head_t后面去。
如下所使:
wait_queue_head_t
lock
task_list---->wait_queue_t
task
task_list----->wait_queue_t
task
task_list
(1):DECLARE_WAIT_QUEUE_HEAD(name)声明一个wait_queue_head_t类型的变量。同时将task_list的前后指针设置为空。
(2):DECLARE_WAIT_QUEUE(name,tsk)
声明一个wait_queue_t型的变量,并将tsk所代表的进程加入到该变量的task成员中。同时将task_list的前后指针设置为空。
(2):init_waitqueue_head初始化一个wait_queue_head_t类型的变量。和DECLARE_WAIT_QUEUE_HEAD没有什么没区别。
(3):init_waitqueue_entry初始化一个wait_queue_t类型的变量。把进程加入到等待队列中。和DECLARE_WAIT_QUEUE没有什么没区别
(4):WQ_CHECK_LIST_HEAD(list)
检查list中的前后指针是否全都是空,如果都是空,debug.
使用方法:一般来说,我们写内核程序的时候不用直接使用wait_queue_t结构,
#我们只用定义一个wait_queue_head_t型的变量,
#使用DECLARE_WAIT_QUEUE_HEAD或者init_waitqueue_head。
#然后使用wait_event或者wait_event_interruptible(在/inlcude/linux/sched.h中定义)进行等待就可以了,其他的操作在这两个函数中都做了,包括声明一个包含一个要加入到等待队列的进程的wait_queue_t变量,和改变量怎样连接到wait_queue_head_t变量中去都做好了。
#唤醒函数使用wake_up或者wait_up_interruptible(在/kernel/sched.c中定义)。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -