简介:
文件系统中的数据分为两类,分别是数据和元数据。
数据:指的是普通文件中的实际数据;
元数据:指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者、以及文件数据块的分布信息等等;
源码定义:
Linux文件系统以块为单位存储信息,为了找到某一个文件所在的存储空间的位置用一个数据结构来对每个文件进行索引,而stat显示的就是该结构体信息,下面我们可以从源码中来看下这个结构体。
sys/stat.h:struct stat {undefinedmode_t st_mode; //文件对应的模式,文件,目录等ino_t st_ino; //inode节点号dev_t st_dev; //设备号码dev_t st_rdev; //特殊设备号码nlink_t st_nlink; //文件的连接数uid_t st_uid; //文件所有者gid_t st_gid; //文件所有者对应的组off_t st_size; //普通文件,对应的文件字节数time_t st_atime; //文件最后被访问的时间time_t st_mtime; //文件内容最后被修改的时间time_t st_ctime; //文件状态改变时间blksize_t st_blksize; //文件内容对应的块大小blkcnt_t st_blocks; //伟建内容对应的块数量};
stat结构体中的st_mode 则定义了下列数种情况:
S_IFLNK 0120000 符号连接S_IFREG 0100000 一般文件S_IFBLK 0060000 区块装置S_IFDIR 0040000 目录S_IFIFO 0010000 先进先出S_ISUID 04000 文件的拥有者在执行中的id位S_ISGID 02000 文件的所属组在执行中的id位S_ISVTX 01000 文件的sticky位S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限S_IRGRP 00040 用户组具可读取权限S_IWGRP 00020 用户组具可写入权限S_IXGRP 00010 用户组具可执行权限S_IROTH 00004 其他用户具可读取权限S_IWOTH 00002 其他用户具可写入权限S_IXOTH 00001 其他用户具可执行权限
查询和处理一个文件的st_mode位的函数:
#include "csapp.h"int main( int argc, char **argv){struct stat stat;char *type, *readok;Stat(argv[1],&stat);if(S_ISREG(stat,st_mod)) /*Determine file type */type = "regular";else if (S_ISDIR(stat.st_mode))type = "directory";elsetype = "other";if ((stat.st_mode & S_IRUSR)) /* Check read access */readok = "yes";elsereadok = "no";printf("type: %s,read: %s\n",type,readok);exit(0);}深入了解计算机操作系统-p633
使用stat函数读取文件信息:
写一个小程序读取自身的大小:
#include <unistd.h>#include <sys/stat.h>#include <stdio.h>int main( int argc, char **argv){struct stat buf;stat("Tstat",&buf);printf("Tstat file size = %d\n",buf.st_size);}

不同用户编译的文件uid

