⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wait.h.txt

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻 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 + -