3.2 Linux文件属性(5、6节)

3.2.5.文件权限管理2

3.2.5.1、access函数检查权限设置

(1)文本权限管控其实蛮复杂,一般很难很容易的确定对一个文件是否具有某种权限。设计优秀的软件应该是:在操作某个文件之前先判断当前是否有权限做这个操作,如果有再做如果没有则提供错误信息给用户。

(2)access函数可以测试得到当前执行程序的那个用户在当前那个环境下对目标文件是否具有某种操作权限。

#include <stdio.h>
#include <unistd.h>

#define NAME 	"3.txt"

int main(void)
{
	int ret = -1;
	
	
	ret = access(NAME, F_OK);
	if (ret < 0)
	{
		printf("文件不存在 \n");
		return -1;
	}
	else
	{
		printf("文件存在	");
	}
	
	ret = access(NAME, R_OK);
	if (ret < 0)
	{
		printf("不可读 ");
	}
	else
	{
		printf("可读 ");
	}

	ret = access(NAME, W_OK);
	if (ret < 0)
	{
		printf("不可写 ");
	}
	else
	{
		printf("可写 ");
	}

	ret = access(NAME, X_OK);
	if (ret < 0)
	{
		printf("不可执行 \n");
	}
	else
	{
		printf("可执行 \n");
	}	
	return 0;
}

3.2.5.2、chmod/fchmod与权限修改

(1)chmod是一个linux命令,用来修改文件的各种权限属性。chmod命令只有root用户才有权利去执行修改。

(2)chmod命令其实内部是用linux的一个叫chmod的API实现的。

#include <stdio.h>
#include <sys/stat.h>


int main(int argc, char **argv)
{
	int ret = -1;
	
	
	if (argc != 2)
	{
		printf("usage: %s filename\n", argv[0]);
		return -1;
	}
	
	ret = chmod(argv[1], S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWOTH);
	if (ret < 0)
	{
		perror("chmod");
		return -1;
	}
	
	return 0;
}

3.2.5.3、chown/fchown/lchown与属主修改

(1)linux中有个chown命令来修改文件属主
(2)chown命令是用chown API实现的

3.2.5.4、umask与文件权限掩码

(1)文件掩码是linux系统中维护的一个全局设置,umask的作用是用来设定我们系统中新创建的文件的默认权限的。
(2)umask命令就是用umask API实现的

3.2.6.读取目录文件

3.2.6.1、opendir与readdir函数

(1)opendir打开一个目录后得到一个DIR类型的指针给readdir使用
(2)readdir函数调用一次就会返回一个struct dirent类型的指针,这个指针指向一个结构体变量,这个结构体变量里面记录了一个目录项(所谓目录项就是目录中的一个子文件)。
(3)readdir调用一次只能读出一个目录项,要想读出目录中所有的目录项必须多次调用readdir函数。readdir函数内部户记住哪个目录项已经被读过了哪个还没读,所以多次调用后不会重复返回已经返回过的目录项。当readdir函数返回NULL时就表示目录中所有的目录项已经读完了。

3.2.6.2、dirent结构体

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>


int main(int argc, char **argv)
{
	DIR *pDir = NULL;
	struct dirent * pEnt = NULL;
	unsigned int cnt = 0;
	
	if (argc != 2)
	{
		printf("usage: %s dirname\n", argv[0]);
		return -1;
	}
	
	pDir = opendir(argv[1]);
	if (NULL == pDir)
	{
		perror("opendir");
		return -1;
	}
	
	while (1)
	{
		pEnt = readdir(pDir);
		if(pEnt != NULL)
		{
			// 还有子文件,在此处理子文件
			printf("name:[%s]	,", pEnt->d_name);
			cnt++;
			if (pEnt->d_type == DT_REG)
			{
				printf("是普通文件\n");
			}
			else
			{
				printf("不是普通文件\n");
			}
		}
		else
		{
			break;
		}
	};
	printf("总文件数为:%d\n", cnt);
	return 0;
}

3.2.6.3、读取目录实战演练

3.2.6.4、可重入函数介绍

(1)有些函数是可重入的有些是不可重入的,具体概念可以去百度。
(2)readdir函数和我们前面接触的一些函数是不同的,首先readdir函数直接返回了一个结构体变量指针,因为readdir内部申请了内存并且给我们返回了地址。多次调用readdir其实readir内部并不会重复申请内存而是使用第一次调用readdir时分配的那个内存。这个设计方法是readdir不可重入的关键。
(3)readdir在多次调用时是有关联的,这个关联也标明readdir函数是不可重入的。
(4)库函数中有一些函数当年刚开始提供时都是不可重入的,后来意识到这种方式不安全,所以重新封装了C库,提供了对应的可重复版本(一般是不可重入版本函数名_r)

猜你喜欢

转载自blog.csdn.net/qq_33662195/article/details/73025413
3.2