工作中遇到
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结构体
2013-03-15 22:02 4346人阅读 评论(5) 收藏 举报
 分类:
系统编程(17) 

在<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. };

本文着眼于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. #define S_ISLNK(m)      (((m) & S_IFMT) == S_IFLNK)
  13. #define S_ISREG(m)      (((m) & S_IFMT) == S_IFREG)
  14. #define S_ISDIR(m)      (((m) & S_IFMT) == S_IFDIR)
  15. #define S_ISCHR(m)      (((m) & S_IFMT) == S_IFCHR)
  16. #define S_ISBLK(m)      (((m) & S_IFMT) == S_IFBLK)
  17. #define S_ISFIFO(m)     (((m) & S_IFMT) == S_IFIFO)
  18. #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");

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

  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>有如下定义:

  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. #define S_IRWXG 00070   /* mask for group permissions */
  6. #define S_IRGRP 00040   /* group has read permission */
  7. #define S_IWGRP 00020   /* group has write permission */
  8. #define S_IXGRP 00010   /* group has execute permission */
  9. #define S_IRWXO 00007   /* mask for permissions for others (not in group) */
  10. #define S_IROTH 00004   /* others have read permission */
  11. #define S_IWOTH 00002   /* others have write permission */
  12. #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

sturct stat 结构体中 st_mode 的含义的更多相关文章

  1. SCROLLINFO结构体中fMask和nPage的理解

    还是VC++中有关显示图像的问题. 我们在显示一幅比较大的图像时,要使用带标准滚动条的对话框.涉及对滚动条的操作就不得不提SCROLLINFO这个结构体.只看单词意思就这道这个结构体要储存滚动条的一些 ...

  2. file结构体中private_data指针的疑惑

    转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...

  3. file结构体中private_data指针的疑惑【转】

    本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private ...

  4. C结构体中数据的内存对齐问题

    转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...

  5. 问题解决——在结构体中使用set保存结构体数据

    =====================声明========================== 本文原创,转载请明确的注明出处和作者,并保持文章的完整性(包括本声明部分). 本文链接:http:/ ...

  6. C语言 结构体中属性的偏移量计算

    //计算结构体偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //详解:对于offscfof ...

  7. C语言 结构体中的成员域偏移量

    //C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...

  8. C语言结构体中的函数指针

      这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...

  9. c语言结构体中的冒号的用法

    结构体中常见的冒号的用法是表示位域. 有些信息在存储时,并不需要占用一个完整的字节,   而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1   两种状态,   用一位二进位即可.为了节省 ...

随机推荐

  1. 在茫茫人海中发现相似的你——局部敏感哈希(LSH)

    一.引入 在做微博文本挖掘的时候,会发现很多微博是高度相似的,因为大量的微博都是转发其他人的微博,并且没有添加评论,导致很多数据是重复或者高度相似的.这给我们进行数据处理带来很大的困扰,我们得想办法把 ...

  2. 高版本jquery尤其是1.10.2的版本设置input radio设置值的最正确的姿势。

    $("input:radio[name="analyshowtype"]").attr("checked",false); $(" ...

  3. 最简单的 Web Service 入门 (看了包会)

    原理:WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于SOAP协议的网络应用间的交互. 作用:主要 ...

  4. vitualbox 主机与虚拟机能相互访问的设置

    1. 桥接网卡 2. 界面名称:802.11n USB Wireless Lan Card 3. 混杂模式:全部允许 4. 接入网线打勾 5. 确定

  5. sql 随机函数newid()

    newid()返回的是uniqueidentifier类型的唯一值.newid()每次产生的值都不一样 从表中随机获取前N条记录 select top N *  from table_name ord ...

  6. [BZOJ 1297][SCOI 2009]迷路(矩阵快速幂)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1297 分析:如果每条边的边权都是1,那么就相当于对邻接矩阵自乘T次(因为写一下递推式子 ...

  7. 15.C#回顾及匿名类型(八章8.1-8.5)

    今天的篇幅应该会很长,除了回顾前面学的一些,还有写一些关于匿名类型的相关知识,总体上对后续的学习很有帮助,学好了,后面更容易理解,不明白的,那就前面多翻几次,看多了总是会理解的.那么,进入正题吧. 自 ...

  8. [Json.net]快速入门

    引言 有个朋友问了一个如何更方便的解析json格式字符串,之前也没怎么研究过json.net,就上网帮他查了一下,现学现卖的给他整了一个demo,这才发现json.net的强大,用着很方便. Json ...

  9. hdu1520 树形dp

    树形dp入门,在树上进行dp. 状态转移方程: dp[i][0] = max(dp[j][0], dp[j][1]);//i为j的上司 并且i不来 dp[i][1] = dp[j][0];//i来了 ...

  10. Java设计模式-桥接模式(Bridge)

    桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...