Linux之管理文件
学习前两点要注意的是:
- 要留意一些低版本的函数和系统函数,能用高版本的就用高版本的。
- 能用 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”查看权限,可以看到修改成功。