sturct stat 结构体中 st_mode 的含义

在<sys/stat.h>中定义的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_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>中有如下定义:
- #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,再与表示目录的数值比较,从而判断这是否是一个目录,下面的代码:
- if ((info.st_mode & S_IFMT) == S_IFDIR)
- printf("this is a directory");
为了简便操作,<sys/stat.h>中提供了宏来代替上述代码,所以如果需要判断文件是不是目录就可以这样:
- 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>有如下定义:
- #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 */
程序中可以自由组合使用它们。
值得一提的是,目录的权限与普通文件的权限是不同的。目录的读、写、执行权限含义分别如下:
(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 的含义的更多相关文章
- SCROLLINFO结构体中fMask和nPage的理解
还是VC++中有关显示图像的问题. 我们在显示一幅比较大的图像时,要使用带标准滚动条的对话框.涉及对滚动条的操作就不得不提SCROLLINFO这个结构体.只看单词意思就这道这个结构体要储存滚动条的一些 ...
- file结构体中private_data指针的疑惑
转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...
- file结构体中private_data指针的疑惑【转】
本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private ...
- C结构体中数据的内存对齐问题
转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...
- 问题解决——在结构体中使用set保存结构体数据
=====================声明========================== 本文原创,转载请明确的注明出处和作者,并保持文章的完整性(包括本声明部分). 本文链接:http:/ ...
- C语言 结构体中属性的偏移量计算
//计算结构体偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //详解:对于offscfof ...
- C语言 结构体中的成员域偏移量
//C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
- C语言结构体中的函数指针
这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...
- c语言结构体中的冒号的用法
结构体中常见的冒号的用法是表示位域. 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省 ...
随机推荐
- Java系列: 关于LinkedList的 ListIterator的add和remove
static void testListIteratorAdd(){ LinkedList<String> strList = new LinkedList<String>() ...
- 从0开始学Java——@override的作用
早上跟着<jsp&Servlet学习笔记>来学习jsp,在使用eclipse创建了一个servlet类之后,发现自动创建的类和书上相比,doGet方法的前面少了@override, ...
- Java实验四 TCP客户端和服务器的应用
实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 4.对通信内容进行摘要计算并验证 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B ...
- android的progressDialog 的使用。android数据异步加载 对话框提示
在调用的Activity中定义一个全局的 progressDialog 点击按钮的时候调用下面这句 progressDialog = ProgressDialog.show(SearchActivit ...
- java8新特性全面解析
在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...
- Pjax.js防刷新技术
自我感觉良好,所以拿出现在自己用的 Pjax.js 分享给大家 当然 这个版本是 经过本人修改后的版本,跟其它 拿过来就用的 不一样 而且区别还不小 大多的 Pjax 都是 跟后台无关的,而这个版本是 ...
- 【JVM】模板解释器--如何根据字节码生成汇编码?
1.背景 仅针对JVM的模板解释器: 如何根据opcode和寻址模式,将bytecode生成汇编码. 本文的示例中所使用的字节码和汇编码,请参见上篇博文:按值传递还是按引用? 2.寻址模式 本文不打算 ...
- 第七章 new的三步曲
这章是本系列文章的重点,这章揭示了js对象的真正本质 看下面的事例 var a = new b(); 等价于 ①var a={}; ②a.__proto__=b.prototype; ③b.call( ...
- 【niubi-job——一个分布式的任务调度框架】----FAQ文档
引言 本文为niubi-job的FAQ文档,该文档会无限更新.如果您在这里没有找到您想要的答案,请把问题提交到这里. FAQ 1.为什么我的所有任务总是运行在同一个节点上,而没有平均分配到所有节点上? ...
- [AHOI2013]找硬币(搜索)
[Ahoi2013]找硬币 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 348 Solved: 114[Submit][Status] Descri ...