获取文件属性的函数:stat、lstat、fstat
这三个是兄弟函数,实现的功能相同,只是略微有区别,我们只要把stat函数搞清楚了,lstat,fstat非常容易理解。
ls命令其实就是调用了这三个函数中的lstat来实现的,我们可以调用lstat函数来自己实现一个ls命令
为什么要讲stat、lstat、fstat函数?
将这三个函数,重点不是实现ls命令,而是通过这三个函数的学习,掌握用法,和理解文件的各种属性
stat
1.函数功能
功能就是获取文件的属性信息
每个文件的属性信息,都是存储在块设备上,该文件有自己的inode节点空间
调用stat函数时,文件系统通过stat给的path,到块设备上索引到该文件的inode节点空间,然后将里面的文件属性信息读到应用程序的缓冲区中,如此得到文件信息。
2.文件属性数据中转的过程
应用缓存<——stat函数提供的内核缓存<——驱动程序的缓存<——块设备上的inode
3.返回值
成功返回0,失败返回-1
4.参数说明
int stat(const char *pathname, struct stat *statbuf);
- const char *pathname:文件路径名
- struct stat *statbuf:应用缓存,用于存放读到文件属性信息
- 缓存的类型为struct stat,通过man 2 stat,可以查看到struct stat结构体类型
所得到的文件基本信息的结果struct stat的结构如下:
struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for file system I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ /* 文件的时间 *///最后一次访问的时间time_t st_atime; /* time of last access */ //最后一次修改的时间time_t st_mtime; /* time of last modification */ //最后一次属性修改的时间,如权限被修改,文件所有者(属主)被修改time_t st_ctime; /* time of last status change */
};
5.代码演示
实现一个自己的ls命令(my_ls),将制定文件的属性信息打印出来
stat("./file", &sta);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);