实验四 文件管理
- 实验目的
(一)实验1
1.加深对文件,目录,文件系统等概念的理解。
2.掌握Linux文件系统的目录结构。
3.掌握有关Linux文件系统操作的常用命令。
4.了解有关文件安全方面的知识。
(二)实验2
(1)掌握LINUX文件系统的基本原理,结构和实现的方法
(2)掌握LINUX文件系统中文件的建立,打开,读写,执行,属性等系统调用的使用.
- 实验内容与要求
- 实验一
(1)运行pwd命令,确定你当前的工作目录。
(2)利用以下命令显示当前工作目录的内容:ls –l
照屏幕上的现实信息,理解各字段的含义。
(3)运行以下命令:ls –ai
观察显示的信息。注意列出的前两项,它们分别表示当前目录和父目录。
使用不带-a选项的ls命令,注意,不再显示隐藏文件了。
使用不带-i选项的ls命令,注意,文件的i节点号不再出现。
(4)使用mkdir命令建立一个子目录subdir。
(5)使用带-d选项的ls命令,你只能看到有关子目录的信息。
(6)使用cd命令,将工作目录改到根目录(/)上。命令格式:cd /
(7)使用ls命令列出根目录的内容,再分别列出各子目录的内容。
步骤:①cd /;②ls;
③ls+子目录名或者cd+子目录名进入子目录后,用ls命令查看。
(8)使用ls -l命令列出/dev的内容,注意各行第一个字符b和c的含义以及规定的访问权限。
(9)使用不带参数的命令cd,然后用pwd命令确定你当前的工作目录是什么。
(10)使用命令cd .. /..,你将工作目录移到什么地方。这个命令同cd /。注意cd .. /..(/前有空格)和cd ../..(/前无空格)的区别。
2.查看你的文件
(1)利用cd命令,将工作目录改到你的主目录上。命令格式:cd+目录名;
(2)将工作目录改到你的子目录subdir,然后运行命令:
date > file1
将当前日期和时间存放到新建文件file1中。
具体步骤:①mkdir subdir;②cd subdir;③date>file1;
(3)使用cat命令查看file1文件的内容。
(4)利用man命令显示date命令的用法:
man date
(5)将date命令的用法附加到文件file1的后面:
man date >> file1
(6)利用cat命令显示文件file1的内容。你会看到,前面date命令的输出和有关date命令的用法的信息都在这个文件中。
(7)利用ls -l file1命令列出文件file1的较详细的信息,注意其中第二字段(链接计数)的值。
(8)利用ln file1../fa命令进行文件链接。然后运行ls -l file1,查看显示的第二段的值发生了什么变化。
(9)现在想利用cat fa命令显示文件fa的内容,应该如何改动工作目录?
(10)设你的主目录是/usr/student,利用ln -s /usr/student/file1 slink进行符号连接。然后,利用ls -l file1 slink显示有关file1和slink的信息。
(11)运行ls -l/bin命令显示目录的内容。
(12)利用ls -l/bin|more命令行分屏显示/bin目录的内容。
3.文件操作
(1)查找文件和目录
利用find命令可以查找文件和目录的位置。你要告诉系统你想查找的文件名和从哪个目录开始进行查找。其常用使用格式是:
find pathname -name filename -print
其中,pathname是指定开始查找的目录,filename是你要查找的文件或目录。-name和-print是find命令的选项。例如:find . –name ‘f*’ –print,在当前目录的父目录的所有子目录中查找名字以f开头的文件名。要查找的文件名模式‘f*’必须用引号括起来,因为其中用到shell的元字符(*)。
(2)查找文件中指定的模式
grep命令常用于文本文件中查找给定的词或短语。包含给定模式字符串的行在标准输出(即显示器)上显示出来。例如:grep root/etc/passwd,在口令文件etc/passwd中查找名称为root的用户是否为和服的用户。
4.文件存取权限
(1)存取权限。Linux系统对所有文件设置了存取权限。存取权限让你确定谁可以对你的个人文件和目录进行访问,以及可以进行什么操作。
把所有用户分为三类:
——文件主(user),即文件的属主。
——组用户(group),即文件组的成员。
——其他用户(other),即能对系统进行访问的所有其他用户。
对一个文件的存取权限分为三种:
——读(r)
——写(w)
——执行(x)
一组存取权限以及相应的文件类型统称为文件模式。如:rw-r--r--表示文件主有读和写的权限,同组用户和其他用户只有读权限。
(2)文件存取权限
读权限(r):允许指定的用户可以打开文件并阅读其内容。如cat,more,file和cp命令等。
写权限(w):允许指定的用户可以打开文件并修改其内容。如vi,mail,cp等。
执行权限(x):允许指定的用户运行(即执行)一个二进制文件或者把一个shell脚本文件当作命令来运行。当你通过输入命令名来调用命令时,你必须具有该命令文件的执行权限。
(3)目录存取权限
读权限(r):允许你列出相应目录中所存放的文件的名字(即目录的内容表)。
写权限(w):允许你从目录中删除已有文件或者把新文件添加到目录中。
查询权限(x):允许你在目录中进行查找和使用cd命令把工作目录放到它这里。
(4)修改文件权限
文件主或root用户可以使用chmod命令来修改文件或目录的权限。修改文件权限的方式有两种:符号模式和绝对模式。
符号模式
使用chmod命令修改当前权限设置的一般形式是:
chmod key file [file...]
其中,key由以下成分组成:
[who] [+|-|=] [mode]
——who这一部分可以由下面的一个和多个字符组成:u,g,o或a,它们分别表示文件主,组用户,其他用户或所有三种用户。默认值是a。
——第二部分必须是以下三个字符中的一个:+,-,或者=,分别表示增加,删除或者设定。
——mode成分可以由以下字符任意组合:r,w或x,分别表示读,写或者执行/查询的权限。
以上三个部分必须依次输入,而且它们之间没有空格。在一个命令行中可以指定多个key,彼此间用逗号隔开,中间没有空格。
如:设文件f原来的权限是rw-rw-r--,现在想让所有用户都具有执行权限,则可使用以下命令:
chmod a+x f
该命令执行后,文件f的权限变成rwxrwxr-x。
练习:首先使用ls –l命令查看文件file1的存取权限。然后用命令 chmod g –r o –r file1修改file1的权限——组用户和其他用户都能被取消对该文件的读权限。最后使用命令ls –l file1核查文件file1存取权限的变化情况。
- 实验二
(1)仔细阅读提供的源代码
(2)理解LINUX文件系统的基本原理
(3)调试提供的源代码
- 实验步骤
- 实验一
按照实验内容顺序进行操作
- 实验二
- 在终端上创建test.c文件把程序放进文件里面,保存退出。
- 编译文件
- 运行程序
- 测试程序
- 程序清单:注意加注释(包含关键字、方法、变量等),在每个模块前加注释
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<syslog.h>
#include<string.h>
#include<stdlib.h>
#define MAX 128
int chmd();
int chmd ()
{
int c;
mode_t mode=S_IWUSR;
printf(" 0. 0700\n 1. 0400\n 2. 0200 \n 3. 0100\n ");
printf("Please input your choice(0-3):");
scanf("%d",&c);
switch(c)
{
case 0: chmod("file1",S_IRWXU);break;
case 1: chmod("file1",S_IRUSR);break;
case 2: chmod("file1",S_IWUSR);break;
case 3: chmod("file1",S_IXUSR);break;
default:printf("You have a wrong choice!\n");
}
return(0);
}
main()
{
int fd;
int num;
int choice;
char buffer[MAX];
struct stat buf;
char* path="/bin/ls";
char* argv[4]={"ls","-l","file1",NULL};
while(1)
{
printf("********************************\n");
printf("0. 退出\n");
printf("1. 创建新文件\n");
printf("2. 写文件\n");
printf("3. 读文件\n");
printf("4. 修改文件权限\n");
printf("5. 查看当前文件的权限修改文件权限\n");
printf("********************************\n");
printf("Please input your choice(0-6):");
scanf("%d",&choice);
switch(choice)
{
case 0:close(fd);
exit(0);
case 1:
fd=open("file1",O_RDWR|O_TRUNC|O_CREAT,0750);
if(fd==-1)
printf("File Create Failed!\n");
else
printf("fd = %d\n",fd);
break;
case 2:
num=read(0,buffer,MAX);
write(fd,buffer,num);
break;
case 3:
read(fd,buffer,MAX);
write(1,buffer,num);
break;
case 4:
chmd ();
printf("Change mode success!\n");
break;
case 5:
execv(path,argv);
break;
default:
printf("You have a wrong choice!\n");
}
}
五、测试结果(运行结果、结果分析)
(一)实验一
实验(二)
1.实验结果
2. 回答问题:
- 程序分析
本程序主要是通过调用系统中“文件的建立、打开、读写、执行”等系统调用函数,实现对 Linux 文件的各种操作,例如创建、读写、修改文件权限等操作。
1.创建新文件 fd=open("filel",0 RDWR O TRUNC O CREAT,0750):
调用函数 open(打开文件,第一个参数为要打开的文件名,第二个参数为打开文件的方式,其中参数 0CREAT 表示当打开的文件不存在时,创建该文件,此时要加上第二个参数,第三个参数表创建文件后文件所具有的权限。该函数的返回值为打开文件的标识符,出错时 fd=-1;
2.写文件 num=read(0,buffer,MAX);调用 read0函数,该函数的第一个参数为要读取的文件描述符,0 表示从输入流中读取文件,第二个参数表示将读取到的数据存放到 buffer 缓冲区中,第三个参数为最大读取的字符个数。函数的返回值为实际读取到的字符数。
write(fd,buffer,num) :
调用 write(函数,该函数的第一个参数为要将数据写入的文件描述符,第二个参数要写入的缓冲区,第三个参数为写入的字符长度。
3.读文件 read(fd,buffer,MAX):
调用该函数,将文件标识符为 fd 中的文件中的数据读取到 buffer 缓冲中write(1,buffer,num) :
调用该函数,将 buffer 缓冲区中的数据写入到输出流中,输出到显示器上。4.修改文件权限 chmod("filel”,S IRWXU);
调用该函数更改文件的权限,其中第一个参数为要更改权限的文件名,第二个参数为要修改到的权限,其中,S IRWXU 表示具有执行、可读、可写权限,S IRUSR 表示具有可读权限,S IWUSR 表示具有可写权限,S IXUSR 表示具有可执行权限。
5.查看当前文件的权限修改文件权限char* path="/bin/ls": char* argv[4]=("ls","-l","filel",NULL); execv(path,argv);调用系统调用execv(函数,表示调用/bin/ls,实际相当于在终端上执行” ls -1file1”,查看文件 file1 的详细信息。
(2)num=read(0,buffer,MAX); write(fd,buffer,num);代码的含义?
表示从标准输入设备中(键盘输入) 读取数据放入buffer 再写到“file1”中
0代表标准输入设备, 1代表标准输出设备 , 2,代表错误输出设备
- 系统调用execv()的用途?
执行 ls -l file1这个命令 这个命令执行后 会列出file1的文件属性
包括访问权限
(4)心得体会
通过本次实验,我加深对文件,目录,文件系统等概念的理解。
六、总结(实验效果分析、心得体会,遗留问题)
通过这次实验我理解Linux文件系统的基本原理,加深对文件,目录,文件系统等概念的理解,掌握Linux文件系统的目录结构,掌握有关Linux文件系统操作的常用命令。了解有关文件安全方面的知识。也明白了做实验要有耐心,只有自己亲自操作才能从中学到知识,要花多一点时间在学习上,学会克制才能优雅。