简介:

文件系统中的数据分为两类,分别是数据和元数据。
数据:指的是普通文件中的实际数据;
元数据:指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者、以及文件数据块的分布信息等等;

源码定义:

Linux文件系统以块为单位存储信息,为了找到某一个文件所在的存储空间的位置用一个数据结构来对每个文件进行索引,而stat显示的就是该结构体信息,下面我们可以从源码中来看下这个结构体。

  1. sys/stat.h:
  2. struct stat {undefined
  3. mode_t st_mode; //文件对应的模式,文件,目录等
  4. ino_t st_ino; //inode节点号
  5. dev_t st_dev; //设备号码
  6. dev_t st_rdev; //特殊设备号码
  7. nlink_t st_nlink; //文件的连接数
  8. uid_t st_uid; //文件所有者
  9. gid_t st_gid; //文件所有者对应的组
  10. off_t st_size; //普通文件,对应的文件字节数
  11. time_t st_atime; //文件最后被访问的时间
  12. time_t st_mtime; //文件内容最后被修改的时间
  13. time_t st_ctime; //文件状态改变时间
  14. blksize_t st_blksize; //文件内容对应的块大小
  15. blkcnt_t st_blocks; //伟建内容对应的块数量
  16. };

stat结构体中的st_mode 则定义了下列数种情况:

  1. S_IFLNK 0120000 符号连接
  2. S_IFREG 0100000 一般文件
  3. S_IFBLK 0060000 区块装置
  4. S_IFDIR 0040000 目录
  5. S_IFIFO 0010000 先进先出
  6. S_ISUID 04000 文件的拥有者在执行中的id
  7. S_ISGID 02000 文件的所属组在执行中的id
  8. S_ISVTX 01000 文件的sticky
  9. S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
  10. S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
  11. S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
  12. S_IRGRP 00040 用户组具可读取权限
  13. S_IWGRP 00020 用户组具可写入权限
  14. S_IXGRP 00010 用户组具可执行权限
  15. S_IROTH 00004 其他用户具可读取权限
  16. S_IWOTH 00002 其他用户具可写入权限
  17. S_IXOTH 00001 其他用户具可执行权限

查询和处理一个文件的st_mode位的函数:

  1. #include "csapp.h"
  2. int main( int argc, char **argv)
  3. {
  4. struct stat stat;
  5. char *type, *readok;
  6. Stat(argv[1],&stat);
  7. if(S_ISREG(stat,st_mod)) /*Determine file type */
  8. type = "regular";
  9. else if (S_ISDIR(stat.st_mode))
  10. type = "directory";
  11. else
  12. type = "other";
  13. if ((stat.st_mode & S_IRUSR)) /* Check read access */
  14. readok = "yes";
  15. else
  16. readok = "no";
  17. printf("type: %s,read: %s\n",type,readok);
  18. exit(0);
  19. }
  20. 深入了解计算机操作系统-p633

使用stat函数读取文件信息:

写一个小程序读取自身的大小:

  1. #include <unistd.h>
  2. #include <sys/stat.h>
  3. #include <stdio.h>
  4. int main( int argc, char **argv)
  5. {
  6. struct stat buf;
  7. stat("Tstat",&buf);
  8. printf("Tstat file size = %d\n",buf.st_size);
  9. }

图片.png
不同用户编译的文件uid
图片.png图片.png