Linux内核API init_waitqueue_entry

init_waitqueue_entry函数功能描述:函数init_waitqueue_entry( )用于实现初始化特定的等待队列元素,将等待队列元素的f lags字段置为0, private字段设置为此函数的第二个参数——进程描述符,并设置字段func的值为default_wake_function,它是一个函数指针,代表唤醒进程时调用的函数。

init_waitqueue_entry文件包含

#include <linux/wait.h>

init_waitqueue_entry函数定义

在内核源码中的位置:linux-3.19.3/include/linux/wait.h

函数定义格式:

static inline void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p)
{
    q->flags = 0;
    q->private = p;
    q->func = default_wake_function;
}

init_waitqueue_entry输入参数说明

此函数的第一个输入参数代表等待队列中的一个元素,在此被初始化,此结构体的定义详细参看abort_exclusive_wait( )

第二个输入参数p是struct task_struct类型的指针变量,代表进程的描述符信息,保存进程的基本信息,其具体定义参看文件linux-3.19.3/include/linux/sched.h,内核注释比较详细。

init_waitqueue_entry返回参数说明

函数的返回值类型是void类型,即不返回任何类型的值。

init_waitqueue_entry实例解析

编写测试文件:init_waitqueue_entry.c

头文件引用:

#include <linux/module.h>
#include <linux/sched.h>
#include <linux/list.h>
#include <linux/kthread.h>
MODULE_LICENSE("GPL");

子进程处理函数定义:

int my_function(void * argc)
{
    printk("in the kernel thread function! \n");
    printk("the current pid is:%d\n", current->pid);     //显示当前进程的进程号
    printk("out the kernel thread function\n");
    return 0;
}

模块加载函数定义:

static int __init init_waitqueue_entry_init(void)
{
    // 局部变量定义
    struct task_struct * result;
    char namefrm[] = "init_waitqueue_entry";
    wait_queue_t data;
    printk("into init_waitqueue_entry_init.\n");
    /*创建1个新进程*/
    result=kthread_create_on_node(my_function, NULL, -1, namefrm);
        wake_up_process(result);
    if(data.private==NULL||data.func==NULL)
    {
        printk("the data has not been initialized\n");
    }
    /*用新进程初始化等待队列元素*/
    init_waitqueue_entry(&data, result);
    if(data.private==result && data.func! =NULL)
    {
        printk("the data has been initialized\n");
        printk("the flags of the data is:%d\n", data.flags);
    }
    else
    {
        printk("the data has not been initialized\n");
    }
    /*显示创建新进程的进程号*/
    printk("the pid of new thread is :%d\n", result->pid);
    printk("the current pid is:%d\n", current->pid); //显示当前进程的PID值
    printk("out init_waitqueue_entry_init.\n");
    return 0;
}

模块退出函数定义:

static void __exit init_waitqueue_entry_exit(void)
{
    printk("Goodbye init_waitqueue_entry\n");
}

模块加载、退出函数调用:

module_init(init_waitqueue_entry_init);
module_exit(init_waitqueue_entry_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod init_waitqueue_entry.ko插入内核模块,然后输入命令dmesg -c查看模块插入结果,会出现如图所示的结果。

Linux内核API init_waitqueue_entry

结果分析:

由上图可以看出函数init_waitqueue_entry( )执行之前等待队列元素的private及func字段的值都为NULL,函数执行之后等待队列元素的private及func字段的值都不为NULL,说明被初始化,并且private字段的值为函数的第二个参数,以此可以说明函数init_waitqueue_entry( )的作用,在函数执行过程中为f lags字段赋值,并且赋值为0。

赞(1)
未经允许不得转载:极客笔记 » Linux内核API init_waitqueue_entry
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址