Linux内核API init_waitqueue_head

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查看模块插入结果,会出现如图所示的结果。

Linux内核API init_waitqueue_head

结果分析:

由上图可以看出函数执行之后等待队列的头指针被初始化了,并且头指针的task_list字段的next和prev字段都指向其本身了,由此说明了函数的作用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程