struct stat各成员含义
2016-06-28 23:20
281 查看
strcut stat中各成员含义:
通过man手册查询struct stat的具体构成,附上源代码可知,
结构体各个成员表示含义:
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个种类,
这些信息包含在了st_mode成员中,通过对其进行解析,可得出一个文件的类型。
具体用法如下:
st_mode中还包含了文件的权限信息
上述均为8进制表示的权限,st_mode成员类型为mode_t型,深入跟踪,也就是unsigned int 型,一个32位的无符号数,但是,暂时只用到了其中的低16位,其中0-8表示权限,9-11位为属组,12-15位为类型。
根据st_uid和st_gid或得其对应的用户,
根据文件最后修改时间转换成容易理解的时间表示法
由此,便将struct stat中的大部分成员含义进行了相应的解析,利用该结构体将打开的文件各种信息保存后进行解析,可以实现类似ls -l 的功能。
程序运行结果如下图所示,运行结果类似于ls -l 命令的输出。
通过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 命令的输出。
相关文章推荐
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#获取网页源代码的方法
- LCL.VBS 病毒源代码
- ASP常用源代码的总结(上)
- php查看网页源代码的方法
- Lua中的源代码预编译浅析
- ASP常用源代码的总结(下)
- android private libraries 中的包源代码添加方法
- jQuery-digest | 咀嚼jQuery源码
- 掌握主流框架的源码实现,理解框架背后的思想(续) 3ff0
- 2048 C++源代码by Reason
- Spark源码分析(1) 从WordCount示例看Spark延迟计算原理
- 37、chen框架v2源代码和示例项目发布
- [源码]Norton Ghost C# 源代码
- [源代码]symantec远程控制软件PcAnywhere源代码分享
- [源代码]Torque3D引擎SDK
- [游戏源码]Doom3公布源代码下载
- 《Doom 3》源代码将在《Rage》上市后免费发布
- 【资料分享】网游[天龙八部]源代码分享
- 类似腾讯手机管家应用源码完整版