3.2 Linux文件属性(3、4节)
2017-06-11 12:18
169 查看
3.2.3.stat函数的应用案例
3.2.3.1、用代码判断文件类型
(1)文件类型就是-、d、l····(2)文件属性中的文件类型标志在struct stat结构体的mode_t st_mode元素中,这个元素其实是一个按位来定义的一个位标志(有点类似于ARM CPU的CPSR寄存器的模式位定义)。这个东西有很多个标志位共同构成,记录了很多信息,如果要查找时按位&操作就知道结果了,但是因为这些位定义不容易记住,因此linux系统给大家事先定义好了很多宏来进行相应操作。
(3)譬如S_ISREG宏返回值是1表示这个文件是一个普通文件,如果文件不是普通文件则返回值是0.
3.2.3.2、用代码判断文件权限设置
(1)st_mode中除了记录了文件类型之外,还记录了一个重要信息:文件权限。(2)linux并没有给文件权限测试提供宏操作,而只是提供了位掩码,所以我们只能用位掩码来自己判断是否具有相应权限。
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #define NAME "1.txt" int main(void) { int ret = -1; struct stat buf; memset(&buf, 0, sizeof(buf)); // memset后buf中全是0 ret = stat(NAME, &buf); // stat后buf中有内容了 if (ret < 0) { perror("stat"); exit(-1); } #if 0 // 判断这个文件属性 //int result = S_ISREG(buf.st_mode); int result = S_ISDIR(buf.st_mode); printf("result = %d\n", result); #endif // 文件权限测试 //unsigned int result = (buf.st_mode & S_IRWXU) >> 8; unsigned int result = ((buf.st_mode & S_IRUSR)? 1: 0); printf("file owner: %u.\n", result); return 0; }
3.2.4.文件权限管理1
3.2.4.1、st_mode中记录的文件权限位
(1)st_mode本质上是一个32位的数(类型就是unsinged int),这个数里的每一个位表示一个含义。(2)文件类型和文件的权限都记录在st_mode中。我们用的时候使用专门的掩码去取出相应的位即可得知相应的信息。
3.2.4.2、ls -l打印出的权限列表
(1)123456789一共9位,3个一组。第一组三个表示文件的属主(owner、user)对该文件的可读、可写、可执行权限;第2组3个位表示文件的属主所在的组(group)对该文件的权限;第3组3个位表示其他用户(others)对该文件的权限。(2)属主就是这个文件属于谁,一般来说文件创建时属主就是创建这个文件的那个用户。但是我们一个文件创建之后还可以用chown命令去修改一个文件的属主,还可以用chgrp命令去修改一个文件所在的组。
3.2.4.3、文件操作时的权限检查规则
(1)一个程序a.out被执行,a.out中试图去操作一个文件1.txt,这时候如何判定a.out是否具有对1.txt的某种操作权限呢?(2)判定方法是:首先1.txt具有9个权限位,规定了3种人(user、group、others)对该文件的操作权限。所以我们判定1.txt是否能被a.out来操作,关键先搞清楚a.out对1.txt到底算哪种人。准确的说是看a.out被谁执行,也就是当前程序(进程)是哪个用户的进程。
(3)刚才上面说的是我的分析,到底对不对还得验证。
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #define NAME "1.txt" int main(void) { int ret = -1; struct stat buf; memset(&buf, 0, sizeof(buf)); // memset后buf中全是0 ret = stat(NAME, &buf); // stat后buf中有内容了 if (ret < 0) { perror("stat"); exit(-1); } #if 0 // 判断这个文件属性 //int result = S_ISREG(buf.st_mode); int result = S_ISDIR(buf.st_mode); printf("result = %d\n", result); #endif // 文件权限测试 //unsigned int result = (buf.st_mode & S_IRWXU) >> 8; unsigned int result = ((buf.st_mode & S_IRUSR)? 1: 0); printf("file owner: %u.\n", result); return 0; }
相关文章推荐
- 文件属性-3.2.linux应用编程和网络编程第2部分
- 3.2 Linux文件属性(5、6节)
- 3.2、linux中的文件属性
- Linux的文件属性与目录配置
- linux文件属性与目录配置
- Linux系统文件类型与文件属性--Linux入门到精通系列
- LINUX的文件属性与目录配置
- Linux 文件,目录的属性
- Linux 文件系统属性更改
- linux系统调用(文件和文件夹的属性)
- 转帖:Linux文件的时间属性
- Linux 文件和目录的属性
- linux 下查看文件属性的命令
- linux 查看文件属性命令
- linux文件属性及权限
- Linux 文件和目录的属性
- Linux学习(一) ─── 文件属性及访问权限控制
- Linux 文件和目录的属性
- linux上去掉文件属性的命令
- 【Unix/Linux】【系统】文件 —— 类型,属性,扩展名