您的位置:首页 > 编程语言

struct stat各成员含义

2016-06-28 23:20 281 查看
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 命令的输出。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct-sta 源代码