函数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
所示的结果。
输入命令ls -l /dev/pts/1查看文件的信息,出现图B
所示的结果。
输入命令cat /etc/passwd |tail -1查看用户ID信息,出现图C
所示的结果。
结果分析:
由截图图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被占用,所以此文件存在,为了方便,作者直接使用,无需再去创建文件及获取器文件描述符。