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查看模块插入结果,会出现如图所示的结果。
结果分析:
由上图可以看出函数init_waitqueue_entry( )执行之前等待队列元素的private及func字段的值都为NULL,函数执行之后等待队列元素的private及func字段的值都不为NULL,说明被初始化,并且private字段的值为函数的第二个参数,以此可以说明函数init_waitqueue_entry( )的作用,在函数执行过程中为f lags字段赋值,并且赋值为0。