strcut stat中各成员含义:
通过man手册查询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 */
};
结构体各个成员表示含义:
st_dev:文件所在磁盘的磁盘的ID号
st_ino:节点编号
st_mode:描述文件的类型和权限
st_nlink:硬链接的数量
st_uid:文件属于用户的ID
st_gid:文件所属用户组ID
st_rdev:如果是设备文件则是设备ID号
st_size:文件大小
st_blksize:文件内容对应的块的大小
st_blocks:文件内容对应得块数量
st_atime:上次访问时间,访问文件的操作会改变该值
st_mtime:上次修改时间,
st_ctime:上次状态改变的时间,对文件的读写将改变该值。
上述众多的结构体成员中,值得细说的还是属于st_mode,它不仅包含的文件的类型,也包含的文件的权限信息。通过在某个目录下运行ls命令,出现一个结果,其中某一行开头的十个字符就是文件的类型和属性。
在linux下,一切皆文件,linux将文件分为7个种类,
普通文件:-
目录文件:d
字符设备文件:c
块设备:b
管道文件:p
链接文件:l
套接字文件:s
这些信息包含在了st_mode成员中,通过对其进行解析,可得出一个文件的类型。
具体用法如下:
///判断文件类型,设置相应的标识
if(S_ISDIR(buf.st_mode))
type='d';
else if(S_ISCHR(buf.st_mode))
type='c';
else if(S_ISBLK(buf.st_mode))
type='b';
else if(S_ISFIFO(buf.st_mode))
type='p';
else if(S_ISLNK(buf.st_mode))
type='l';
else if(S_ISSOCK(buf.st_mode))
type='s';
st_mode中还包含了文件的权限信息
The following flags are defined for the st_mode field:
S_IFMT 0170000 bit mask for the file type bit fields
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
S_ISUID 0004000 set UID bit
S_ISGID 0002000 set-group-ID bit (see below)
S_ISVTX 0001000 sticky bit (see below)
S_IRWXU 00700 mask for file owner permissions
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
上述均为8进制表示的权限,st_mode成员类型为mode_t型,深入跟踪,也就是unsigned int 型,一个32位的无符号数,但是,暂时只用到了其中的低16位,其中0-8表示权限,9-11位为属组,12-15位为类型。
若一个文件属性直接用无符号数打印出来出现的是 16877,该数字为十进制,转换为8进制,则表示成040755.
根据文件类型可知040755=0040000+00400+00200+00100+00040+00010+00004+00001=S_IFSIR+S_IRUSR+S_IWUSR+S_IXUSR+S_IRGRP+S_IXGRP+S_IROTH+S_IXOTH
即ls -l下开头部分表示 drwxr-xr-x
///获取文件的权限
if(buf.st_mode & S_IRUSR)
ownrd='r';
if(buf.st_mode & S_IWUSR)
ownwt='w';
if(buf.st_mode & S_IXUSR)
ownet='x';
if(buf.st_mode & S_IRGRP)
grprd='r';
if(buf.st_mode & S_IWGRP)
grpwt='w';
if(buf.st_mode & S_IXGRP)
grpet='x';
if(buf.st_mode & S_IROTH)
othrd='r';
if(buf.st_mode & S_IWOTH)
othwt='w';
if(buf.st_mode & S_IXOTH)
othet='x';
根据st_uid和st_gid或得其对应的用户,
struct passwd *pa;
pa=getpwuid(buf.st_uid);
struct group *gp;
gp=getgrgid(buf.st_gid);
根据文件最后修改时间转换成容易理解的时间表示法
struct tm *ct;
ct=localtime(&buf.st_ctime);
由此,便将struct stat中的大部分成员含义进行了相应的解析,利用该结构体将打开的文件各种信息保存后进行解析,可以实现类似ls -l 的功能。
printf("%c%c%c%c%c%c%c%c%c%c %-d %-s %-s %-ld %-2d %-2d %-d:%-d %s\n",
type,ownrd,ownwt,ownet,grprd,grpwt,
grpet,othrd,othwt,othet,buf.st_nlink,pa->pw_name,gp->gr_name,buf.st_size,ct->tm_mon+1,ct->tm_mday,ct->tm_hour,ct->tm_min,filename);
程序运行结果如下图所示,运行结果类似于ls -l 命令的输出。