zoukankan      html  css  js  c++  java
  • sturct stat 结构体中 st_mode 的含义

    工作中遇到
    else if( (s_buf.st_mode&S_IFMT) == S_IFDIR) return 2;
    else if( !(s_buf.st_mode&S_IFREG) || access(file, W_OK) == -1) return 0;
    return 1;     来了解一下stat结构体

    sturct stat 结构体中 st_mode 的含义

     分类:
     

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

    [cpp] view plain copy
     
     print?
    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.            };  

    本文着眼于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>中有如下定义:

    [cpp] view plain copy
     
     print?
    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)  


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

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

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

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

    [cpp] view plain copy
     
     print?
    1. if ((info.st_mode & S_IFMT) == S_IFDIR)  
    2.     printf("this is a directory");  


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

    [cpp] view plain copy
     
     print?
    1. if (S_ISDIR(info.st_mode))  
    2.     printf("this is a directory");  

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

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

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

    [cpp] view plain copy
     
     print?
    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 */  

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

    值得一提的是,目录的权限与普通文件的权限是不同的。目录的读、写、执行权限含义分别如下:

    (1)读权限。读权限允许我们通过opendir()函数读取目录,进而可以通过readdir()函数获得目录内容,即目录下的文件列表。

    (2)写权限。写权限代表的是可在目录内创建、删除文件,而不是指的写目录本身。

    (3)执行权限。可访问目录中的文件。

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

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

    来自:http://blog.csdn.net/astrotycoon/article/details/8679676

  • 相关阅读:
    JS原生隐士标签扩展
    Asp.Net MVC强类型页面获取值几种方式
    Asp.Net MVC控制器获取视图传值几种方式
    vs2015 创建MVC项目
    C#后台HttpWebRequest模拟跨域Ajax请求,注册Windows服务到服务器上
    EF简介及CRUD简单DEMO
    Impala学习--代码生成(Code Generation)
    Impala源代码分析(2)-SQL解析与执行计划生成
    Impala源代码分析(3)-backend查询执行过程
    Impala源代码分析(1)-Impala架构和RPC
  • 原文地址:https://www.cnblogs.com/the-tops/p/5660377.html
Copyright © 2011-2022 走看看