1、文件权限管理
1.1、st_mode中记录的文件权限位
(1)st_mode本质上是一个32位的数(类型就是unsigned int),这个数里的每一位对应着一个含义
(2)文件类型和文件的权限都记录在st_mode
1.2、ls -l打印出的权限列表
(1)123456789一共9位,3个一组。第1组3个位表示文件的属主(owner、user)对该文件的可读、可写、可执行权限;第2组3个位表示文件所在的组(group)对该文件的权限;第3组3个位表示其他用户(others)对该文件的权限
(2)属主就是这个文件属于谁,一般来说文件创建时属主就是创建这个文件的那个用户。但是我们一个文件创建之后还可以用chown命令来修改一个文件的属主,还可以用chgrp命令去修改一个文件的组
1.3、文件操作时的权限检查规则
(1)一个程序a.out被执行,a.out中试图去操作一个文件的1.txt,这时候如何判定a.out是否对1.txt的某种权限呢
判定方法:首先1.txt具有9个权限位,规定了user、group和others三个类别对该文件的操作权限。所以判定1.txt是否能被a.out操作,关键先搞清楚a.out对1.txt到底是哪个类别。
1.4、修改权限命令:(这些命令都是由相应的API来实现的)
chmod:chmod是一个linux命令,用来修改文件的各种权限属性。chmod命令只有root用户才有权利去执行修改。
chown:利用 chown 将指定文件的拥有者改为指定的用户或组
chgrp:用于变更文件或目录的所属群组
1.5、access函数检查权限设置
(1)access函数可以测试得到当前执行程序的那个用户在当前那个环境下对目标文件是否具有某种操作权限
#include <stdio.h>
#include <unistd.h>
#define FILENAME "1.txt"
int main(void)
{
int ret = -1;
ret = access(FILENAME, F_OK);
if (ret < 0)
{
printf("文件不存在 ");
return -1;
}
else
{
printf("文件存在\n");
}
ret = access(FILENAME, R_OK);
if (ret < 0)
{
printf("不可读\n");
}
else
{
printf("可读\n");
}
ret = access(FILENAME, W_OK);
if (ret < 0)
{
printf("不可写\n");
}
else
{
printf("可写\n");
}
ret = access(FILENAME, X_OK);
if (ret < 0)
{
printf("不可执行\n");
}
else
{
printf("可执行\n");
}
return 0;
}
1.6、umask与文件权限掩码
文件掩码是Linux系统中维护的一个全局设置,作用是用来设定我们系统中新创建的文件的默认权限。比如系统默认的文件权限是可读可写不可执行。
1.7、读取目录文件-opendir与readdir
(1)readdir函数调用一次就会返回一个struct dirent类型的指针,这个指针指向一个结构体变量,这个结构体变量里面记录了一个目录项(所谓目录项就是目录中的一个子文件)。
(2)readdir调用一次只能读出一个目录项,要想读出目录中所有的目录项必须多次调用readdir函数。readdir函数内部户记住哪个目录项已经被读过了哪个还没读,所以多次调用后不会重复返回已经返回过的目录项。当readdir函数返回NULL时就表示目录中所有的目录项已经读完了。
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *pDir = NULL;
struct dirent *pRent = NULL;
if (2 != argc)
{
printf("two arguments\n");
return -1;
}
pDir = opendir(argv[1]);
if (NULL == pDir)
{
perror("opendir");
return -1;
}
while (1)
{
pRent = readdir(pDir);
if (NULL == pRent)
{
break;
}
else
{
printf("name:[%s] \n", pRent->d_name);
}
}
return 0;
}
1.8、可重入函数
(1)重入意味着这个函数可以重复进入,可以被并行调用,可以被中断,它只使用自身栈上的数据变量,它不依赖于任务环境,在多任务调度过程中,它是安全的,不必担心数据出错。
(2)不可重入,意味着不可被并行调度,否则会产生不可预料的结果,这些函数体内一般使用了静态(static)的数据结构,使用了malloc()或者free()函数,使用了标准I/O函数等等。
(3)与readdir函数对比结合
readdir函数直接返回了一个结构体变量指针,因为readdir内部申请了内存并且给我们返回了地址。多次调用readdir其实readir内部并不会重复申请内存而是使用第一次调用readdir时分配的那个内存。这个设计方法是readdir不可重入的关键。
readdir在多次调用时是有关联的,这个关联也标明readdir函数是不可重入的。