Linux之管理文件

Linux之管理文件

学习前两点要注意的是:

  1. 要留意一些低版本的函数和系统函数,能用高版本的就用高版本的
  2. 能用 c 库中的函数就用 c 库中的函数,而不要用系统的函数和接口,c 的移植性更强,任何系统函数换了平台都可能无法使用了,但是绝大多数平台都可以支持 c 库,包括 Android,QtE 等等平台。

一、 文件元数据以及基础知识

每一个文件都有一个索引节点 inode,inode 是由文件系统提供的唯一数值编址,这个数值称为 inode 编号。索引节点是唯一的,同一个系统下,每一个索引节点对应一个文件(目录也可以当做文件),inode 中存储了与文件相关的元数据,例如访问权限,访问时间,所有者,用户组,大小以及文件数据存储位置。
如下图所示,在虚拟机的 Ubuntu 系统下使用命令“ls -i”,可以看到文件和目录的 inode。
在这里插入图片描述
另外在启动开发板,在超级终端中也可以使用这个命令,如下图所示。
在这里插入图片描述
如上图所示,可以看到各种不同的索引节点。不知道大家发现没有目录 proc 和 sys 的索引节点是一样的,这两个其实都是指向同一个文件,就像一个人有小名和学名一样,指的都是同一个人。这种情况是属于 linux 文件中的硬链接,在后面会介绍到。

二、stat 函数组

从这个实验开始,会更多的使用 man 来学习各种函数和 API 接口。
本节会介绍详细一些,这个过程大家好掌握,后面的实验就很直接的给出截图和分析函数的使用了。如果觉得掌握的不够,自己看几页 man 的文档也花不了多长时间,毕竟它是如此重要的知识点。

1、使用 man 学习 stat 函数组

如下图所示,使用命令“man 2 stat”查看 stat 函数组的文档。可以看到函数的头文件以及函数组。
在这里插入图片描述
如下图所示,可以看到保存文件的结构体 struct stat,如下图所示,可以看到非常详细的结构成员注释。
在这里插入图片描述
下翻一下,可以看到很多的宏定义解释,这些具体用到的时候可以来查阅,如下图所示,是结构成员 st_mode 的参数。
在这里插入图片描述
其实下面对于系统函数或者 API 的介绍,在 man 文档中都有介绍,大家可以自己尝试着看一下部分英文的内容。

int stat(const char *path, struct stat *buf);
//参数*path:文件路径。
//参数*buf:文件信息。
//返回值:成功为 0,否则为-1。
int fstat(int fd, struct stat *buf);
//参数 fd:文件描述符。
//参数*buf:文件信息
//返回值:成功为 0,否则为-1。
int lstat(const char *path, struct stat *buf);
//参数*path:文件路径。
//参数*buf:返回文件的信息,针对符号链接,lstat 返回链接本身,而不是而非目标文件;
//stat 返回的是目标文件。链接可以类比 window 下的快捷方式。
//返回值:成功为 0,否则为-1。

2、stat 函数组例程

#include <stdio.h>
//通过man文档可以查看到stat函数组头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

//open函数的参数头文件
#include <fcntl.h>

int main(int argc,char *argv[])
{
	struct stat groupstat;
	int fd,ret;
	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}

//stat函数测试	
	ret = stat(argv[1],&groupstat);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("stat function test , %s of st_ino inode is %ld\n",argv[1],groupstat.st_ino);
	
//fstat函数测试
	fd = open(argv[1],O_RDWR|O_NOCTTY|O_NDELAY);
	if(fd<0)
	{
		printf("Please make sure file path\n");
		return 1;
	}
	ret = fstat(fd,&groupstat);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("fstat function test , %s of st_ino inode is %ld\n",argv[1],groupstat.st_ino);
	
//lstat函数测试	
	ret = lstat(argv[1],&groupstat);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("lstat function test , %s of st_ino inode is %ld\n",argv[1],groupstat.st_ino);

	return 0;
}

3、测试结果

在这里插入图片描述

三、chmod 权限函数

1、 使用 man 学习 chmod 函数

如下图所示,使用命令“man 2 chmod”。有 chmod 和 fchmod 两个函数。
在这里插入图片描述
接着介绍一下 chmod 和 fchmod 的用法。

int chmod(const char *path, mode_t mode);
//参数*path:文件路径。
//参数 mode:直接使用数字即可。和前面命令中 chmod 777 xxx 中的 777 这个参数含义类似,也可以使用文档中的组合值。
//返回值:成功返回 0,错误返回-1。
int fchmod(int fd, mode_t mode);
//参数 fd:文件描述符。
//参数:直接使用数字即可。和前面命令中 chmod 777 xxx 中的 777 这个参数含义类似,也可以使用文档中的组合值。
//返回值:成功返回 0,错误返回-1。

2、chmod 函数例程

编写简单的 chmod.c 文件测试 chmod 和 fchmod 函数。

#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc,char *argv[])
{
	int fd,ret;
	
	if(argc <3){
		printf("\nPlease input file path\n");
		return 1;
	}
	
//chmod函数测试	
	ret = chmod(argv[1],0777);
	if(ret<0){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("chmod %s 0777 is success!\n",argv[1]);

//fchmod函数测试		
	fd = open(argv[2],O_RDWR|O_NOCTTY|O_NDELAY);
	if(fd<0)
	{
		printf("Please make sure file path\n");
		return 1;
	}
	ret = fchmod(fd,0555);
	if(ret<0){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("fchmod %s 0555 is success!\n",argv[1]);
	
	return 0;
}

3、测试结果

在这里插入图片描述
如上图所示,将./mnt/udisk 中的 stat 和 stat.c 文件权限修改,然后使用命令“ls -l”查看权限,可以看到修改成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值