您的位置:首页 > 运维架构 > Linux

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; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: