sturct stat 结构体中 st_mode 的含义

    

        sturct stat 结构体中 st_mode 的含义             

        分类:             系统编程                   430人阅读     评论(0)     收藏     举报    

在<sys/stat.h>中定义的stat结构体内容如下:

  1. struct stat {  
  2.                dev_t     st_dev;     /* ID of device containing file */  
  3.                ino_t     st_ino;     /* inode number */  
  4.                mode_t    st_mode;    /* protection */  
  5.                nlink_t   st_nlink;   /* number of hard links */  
  6.                uid_t     st_uid;     /* user ID of owner */  
  7.                gid_t     st_gid;     /* group ID of owner */  
  8.                dev_t     st_rdev;    /* device ID (if special file) */  
  9.                off_t     st_size;    /* total size, in bytes */  
  10.                blksize_t st_blksize; /* blocksize for file system I/O */  
  11.                blkcnt_t  st_blocks;  /* number of 512B blocks allocated */  
  12.                time_t    st_atime;   /* time of last access */  
  13.                time_t    st_mtime;   /* time of last modification */  
  14.                time_t    st_ctime;   /* time of last status change */  
  15.            };  
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_mode成员,该成员描述了文件的类型权限两个属性。

st_mode是个32位的整型变量,不过现在的linux操作系统只用了低16位(估计是鉴于以后拓展的考虑)。 

===============================================================================================================

先看File type属性区域,位于bit12 ~ bit15.

在现代linux操作系统上文件类型共分为7种,分别是:

普通文件(regular file)

目录(directory)

字符设备(character device)

块设备(block device)

管道(FIFO<pipe>)

符号链接文件(symbolic link)

套接口文件(socket)

所以File type属性只需3bit就够了,估计也是考虑到了以后的扩展问题。
 

在<sys/stat.h>中有如下定义:

  1. #define S_IFMT  00170000  
  2. #define S_IFSOCK 0140000  
  3. #define S_IFLNK  0120000  
  4. #define S_IFREG  0100000  
  5. #define S_IFBLK  0060000  
  6. #define S_IFDIR  0040000  
  7. #define S_IFCHR  0020000  
  8. #define S_IFIFO  0010000  
  9. #define S_ISUID  0004000  
  10. #define S_ISGID  0002000  
  11. #define S_ISVTX  0001000  
  12.   
  13. #define S_ISLNK(m)      (((m) & S_IFMT) == S_IFLNK)  
  14. #define S_ISREG(m)      (((m) & S_IFMT) == S_IFREG)  
  15. #define S_ISDIR(m)      (((m) & S_IFMT) == S_IFDIR)  
  16. #define S_ISCHR(m)      (((m) & S_IFMT) == S_IFCHR)  
  17. #define S_ISBLK(m)      (((m) & S_IFMT) == S_IFBLK)  
  18. #define S_ISFIFO(m)     (((m) & S_IFMT) == S_IFIFO)  
  19. #define S_ISSOCK(m)     (((m) & S_IFMT) == S_IFSOCK)  
#define S_IFMT  00170000
#define S_IFSOCK 0140000
#define S_IFLNK  0120000
#define S_IFREG  0100000
#define S_IFBLK  0060000
#define S_IFDIR  0040000
#define S_IFCHR  0020000
#define S_IFIFO  0010000
#define S_ISUID  0004000
#define S_ISGID  0002000
#define S_ISVTX  0001000

#define S_ISLNK(m)      (((m) & S_IFMT) == S_IFLNK)
#define S_ISREG(m)      (((m) & S_IFMT) == S_IFREG)
#define S_ISDIR(m)      (((m) & S_IFMT) == S_IFDIR)
#define S_ISCHR(m)      (((m) & S_IFMT) == S_IFCHR)
#define S_ISBLK(m)      (((m) & S_IFMT) == S_IFBLK)
#define S_ISFIFO(m)     (((m) & S_IFMT) == S_IFIFO)
#define S_ISSOCK(m)     (((m) & S_IFMT) == S_IFSOCK)


首先S_IFMT是一个掩码,它的值是017000(注意这里用的是八进制), 可以用来过滤出前四位表示的文件类型。

其后的连续七个分别对应套接口文件、符号链接文件、普通文件、块设备、目录、字符设备、管道,它们分别对应一个不同的值。

现在假设我们要判断一个文件是不是目录,我们怎么做呢?

很简单,首先通过掩码S_IFMT把其他无关的部分置0,再与表示目录的数值比较,从而判断这是否是一个目录,下面的代码:

  1. if ((info.st_mode & S_IFMT) == S_IFDIR)  
  2.     printf("this is a directory");  
if ((info.st_mode & S_IFMT) == S_IFDIR)
    printf("this is a directory");


为了简便操作,<sys/stat.h>中提供了宏来代替上述代码,所以如果需要判断文件是不是目录就可以这样:

  1. if (S_ISDIR(info.st_mode))  
  2.     printf("this is a directory");  
if (S_ISDIR(info.st_mode))
    printf("this is a directory");

===============================================================================================================

 

接着来看Permission属性区域的bit0~bit8,也即st_mode字段的最低9位,代表文件的许可权限,它标识了文件所有者(owner)、组用户(group)、其他用户(other)的读(r)、写(w)、执行(x)权限。

在<sys/stat.h>有如下定义:

  1. #define S_IRWXU 00700   /* mask for file owner permissions */  
  2. #define S_IRUSR 00400   /* owner has read permission */  
  3. #define S_IWUSR 00200   /* owner has write permission */  
  4. #define S_IXUSR 00100   /* owner has execute permission */  
  5.   
  6. #define S_IRWXG 00070   /* mask for group permissions */  
  7. #define S_IRGRP 00040   /* group has read permission */  
  8. #define S_IWGRP 00020   /* group has write permission */  
  9. #define S_IXGRP 00010   /* group has execute permission */  
  10.   
  11. #define S_IRWXO 00007   /* mask for permissions for others (not in group) */  
  12. #define S_IROTH 00004   /* others have read permission */  
  13. #define S_IWOTH 00002   /* others have write permission */  
  14. #define S_IXOTH 00001   /* others have execute permission */  
#define S_IRWXU 00700	/* mask for file owner permissions */
#define S_IRUSR 00400	/* owner has read permission */
#define S_IWUSR 00200	/* owner has write permission */
#define S_IXUSR 00100	/* owner has execute permission */

#define S_IRWXG 00070	/* mask for group permissions */
#define S_IRGRP 00040	/* group has read permission */
#define S_IWGRP 00020	/* group has write permission */
#define S_IXGRP 00010	/* group has execute permission */

#define S_IRWXO 00007	/* mask for permissions for others (not in group) */
#define S_IROTH 00004	/* others have read permission */
#define S_IWOTH 00002	/* others have write permission */
#define S_IXOTH 00001	/* others have execute permission */

 程序中可以自由组合使用它们。===============================================================================================================

 

最后来看Permission属性区域的bit9 ~ bit11,这三个bit比较特殊,代表文件的特殊属性,分别为set-user-ID位、set-group-ID位和sticky位,下面一一介绍每个位的含义。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值