Linux内核API dput

dput()函数的作用是释放一个dentry结构体,并且将该结构体的使用计数d_count的值作减1操作,将该结构体从队列中删除,同时,释放该结构体的资源,如果是父结构体也被释放,则该结构体与父结构体将同时被删除。

dput文件包含

#include <linux/dcache.h>

dput函数定义

在内核源码中的位置:linux-3.19.3/fs/dcache.c

函数定义格式:

void dput(struct dentry *dentry)

dput输入参数说明

  • dentry:要被释放掉的dentry结构体。对于dentry结构体,其定义及详细说明参考极客笔记中d_alloc()函数的参数说明部分。

dput返回参数说明

  • dput()函数无返回值。

dput实例解析

编写测试文件:dput.c

头文件声明如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fs_struct.h>
#include <linux/path.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");

模块初始化函数:

int dput_init(void)
{
    struct dentry *dentry_pwd = current->fs->pwd.dentry; //获取当前文件的入口目录
    /*显示当前目录的引用数目*/
    printk("Before \"dput\", the d_count of current dentry is %d\n", dentry_pwd->d_count);
    dput(dentry_pwd);      //释放dentry_pwd结构体

    /*显示函数调用之后,当前目录的引用数目*/
    printk("After \"dput\", the d_count of current dentry is %d\n", dentry_pwd->d_count);
    return 0;
}

模块退出函数:

void dput_exit(void)
{
    printk("Goodbye dput\n");
}

模块初始化及退出函数调用:

module_init(dput_init);
module_exit(dput_exit);

实例运行结果及分析:

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

Linux内核API dput

结果分析:

执行函数dput之后,其中的计数器会减去1,而在本例中,一开始的计数器值为247,执行函数过后,释放掉当前dentry结构体,计数器的值变为246。

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

评论 抢沙发

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