struct stat各成员含义

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 命令的输出。

运行结果如图示

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值