init_waitqueue_head函数功能描述:函数init_waitqueue_head( )实现初始化等待队列头指针,使参数q的task_list字段的next与prev都指向头指针自身。
init_waitqueue_head文件包含
#include <linux/wait.h>
init_waitqueue_head函数定义
在内核源码中的位置:linux-3.19.3/include/linux/wait.h
函数定义格式:
#define init_waitqueue_head(q) \
do { \
static struct lock_class_key __key; \
__init_waitqueue_head((q), #q, &__key); \
}while(0)
init_waitqueue_head输入参数说明
此函数的输入参数代表等待队列头指针,此头指针是静态分配的,此结构体的详细信息参看函数__wait_up。
init_waitqueue_head返回参数说明
此函数的返回值类型是void类型,即不返回任何类型的值。
init_waitqueue_head实例解析
编写测试文件:init_waitqueue_head.c
头文件引用:
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/list.h>
MODULE_LICENSE("GPL");
模块加载函数定义:
static int __init init_waitqueue_head_init(void)
{
wait_queue_head_t head; //等待队列头
printk("into init_waitqueue_head_init.\n");
if(head.task_list.next==NULL || head.task_list.prev==NULL)
{
printk("the head has not been initialized\n");
}
init_waitqueue_head(&head); //初始化等待队列头指针
if(head.task_list.next==&head.task_list&&head.task_list.prev==&head.task_list)
{
printk("the head has been initialized\n");
}
else
{
printk("the head has not been initialized\n");
}
printk("out init_waitqueue_head_init.\n");
return 0;
}
模块退出函数定义:
static void __exit init_waitqueue_head_exit(void)
{
printk("Goodbye init_waitqueue_head\n");
}
模块加载、退出函数调用:
module_init(init_waitqueue_head_init);
module_exit(init_waitqueue_head_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod init_waitqueue_head.ko插入内核模块,然后输入命令dmesg -c查看模块插入结果,会出现如图所示的结果。
结果分析:
由上图可以看出函数执行之后等待队列的头指针被初始化了,并且头指针的task_list字段的next和prev字段都指向其本身了,由此说明了函数的作用。