Linux内核API vfs_fstat

函数vfs_fstat()根据第一个参数fd查找相应的文件,获取文件的属性信息,然后将属性信息保存在函数的第二个参数stat中。

vfs_fstat文件包含

#include <linux/fs.h>

vfs_fstat函数定义

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

函数定义格式:

int vfs_fstat(unsigned int fd, struct kstat * stat)

vfs_fstat输入参数说明

  • 函数的第一个输入参数是一个int型的变量,表示文件的描述符,与在用户态下使用函数open()打开文件返回值的意义相同。

  • 函数的第二个参数是struct kstat结构体类型的指针,用于保存查找文件的基本信息,对于kstat结构体,其定义及详细说明参考极客笔记中generic_fillattr()函数的参数说明部分。

vfs_fstat返回参数说明

  • 函数的返回结果是int型的变量,可能的取值是0和负数,代表获取文件属性的成功与否,如果返回0,说明查找文件成功,将文件的基本属性信息保存在参数stat中;如果返回负数,代表查找文件失败,无法获取文件的基本信息。

vfs_fstat实例解析

编写测试文件:vfs_fstat.c

头文件声明如下:

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

模块加载函数定义:

int vfs_fstat_init(void)
{
    int fd = 1, result=0;  //fd代表文件/dev/pts/1的文件描述符
    struct kstat stat;     //定义结构体保存文件的基本信息
    printk("into vfs_fstat_init\n");

    /*调用函数获取文件的基本信息*/
    result = vfs_fstat(fd, &stat);
    printk("The result of function vfs_fstat is :%d\n", result); //显示函数调用结果

    /*显示函数vfs_fstat函数调用之后,获取文件的基本属性信息*/
    printk("The new value of the stat after function vfs_fstat:\n");
    printk("The nlink value is :%d\n", stat.nlink);
    printk("The UID is:%d\n", stat.uid);
    printk("The GID is :%d\n", stat.gid);
    printk("The dev value :%d\n", stat.dev);
    printk("out vfs_fstat_init\n");
    return 0;
}

模块卸载函数定义:

void vfs_fstat_exit(void)
{
    printk("Goodbye vfs_fstat\n");
}

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

module_init(vfs_fstat_init);
module_exit(vfs_fstat_exit);

实例运行结果及分析:

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

Linux内核API vfs_fstat

输入命令ls -l /dev/pts/1查看文件的信息,出现图B所示的结果。

Linux内核API vfs_fstat

输入命令cat /etc/passwd |tail -1查看用户ID信息,出现图C所示的结果。

Linux内核API vfs_fstat

结果分析:

由截图图A可知函数vfs_fstat()执行成功,成功地获取了文件描述符所代表的文件的信息,文件的硬链接数是1,所属用户的id是1000,所在组id是5,对应的设备号是13,此处只是显示部分信息,没有全部显示。图B是通过命令ls -al /dev/pts/1查看文件的结果,文件属于用户localhost,并且其硬链接数为1,与图A对应。图C中执行命令查看用户localhost的信息,用户ID为1000,与图A的结果相吻合。

对于函数第一个参数的传递,作者传递的是1,因为对与系统文件描述符1被占用,所以此文件存在,为了方便,作者直接使用,无需再去创建文件及获取器文件描述符。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程