1、第 1 页操作系统原理实验报告专 业 网络工程 班 级 14-2 学 号 14034460220 姓 名 林浩强 指导教师 陈 珂 完成时间 2016.12.08 成 绩 第 2 页实验四 LINUX 文件系统编程一、实验目的 1加深对文件,目录,文件系统等概念的理解。2掌握 Linux文件系统的目录结构。3掌握有关 Linux文件系统操作的常用命令。4了解有关文件安全方面的知识。5掌握 LINUX文件系统的基本原理,结构和实现的方法6掌握 LINUX文件系统中文件的建立,打开,读写,执行,属性等系统调用的使用.二、实验内容1浏览文件系统2查看文件3文件操作4文件存取权限5仔细阅读提供的源代码
2、6理解 LINUX 文件系统的基本原理7调试提供的源代码三、实验步骤一、Linux 常用文件命令1、浏览文件系统1.1运行 pwd命令,确定你当前的工作目录。1.2利用以下命令显示当前工作目录的内容:ls l第 3 页1.3运行以下命令:ls ai1.4使用 mkdir命令建立一个子目录 subdir。1.5使用带-d 选项的 ls命令,你只能看到有关子目录的信息。1.6使用 cd命令,将工作目录改到根目录(/)上。命令格式:cd /1.7使用 ls命令列出根目录的内容,再分别列出各子目录的内容。第 4 页1.8使用 ls -l命令列出/dev 的内容1.9使用不带参数的命令 cd,然后用 p
3、wd命令确定你当前的工作目录是什么。1.10使用命令 cd /,你将工作目录移到什么地方。注意“/”前有无空格的区别。2、查看文件2.1利用 cd命令,将工作目录改到你的主目录上。2.2将工作目录改到你的子目录 subdir,然后运行命令:date file1将当前日期和时间存放到新建文件 file1中。第 5 页2.3使用 cat命令查看 file1文件的内容。2.4利用 man命令显示 date命令的用法2.5将 date命令的用法附加到文件 file1的后面2.6利用 cat命令显示文件 file1的内容。第 6 页2.7利用 ls -l file1命令列出文件 file1的较详细的信息
4、,注意其中第二字段(链接计数)的值。2.8利用 ln file1/fa命令进行文件链接。然后运行 ls -l file1,查看显示的第二段的值发生了什么变化。2.9现在想利用 cat fa命令显示文件 fa的内容,应该如何改动工作目录?第 7 页2.10假设你的主目录是/usr/student,利用 ln -s /usr/student/file1 slink进行符号连接。然后,利用 ls -l file1 slink显示有关 file1和 slink的信息。2.11运行 ls -l/bin命令显示目录的内容。2.12利用 ls -l/bin|more命令行分屏显示/bin 目录的内容。第 8
5、 页3、文件操作3.1利用 find命令查找文件和目录3.2查找文件中指定的内容4、文件与目录存取权限4.1 文件读权限(r):允许指定的用户可以打开文件并阅读其内容。如cat,more,file 和 cp命令等。4.2文件写权限(w):允许指定的用户可以打开文件并修改其内容。如 vi,mail,cp等。第 9 页4.3文件执行权限(x):允许指定的用户运行(即执行)一个二进制文件或者把一个shell脚本文件当作命令来运行。当你通过输入命令名来调用命令时,你必须具有该命令文件的执行权限。4.4目录读权限(r):允许你列出相应目录中所存放的文件的名字(即目录的内容表) 。4.5目录写权限(w):
6、允许你从目录中删除已有文件或者把新文件添加到目录中。4.6目录查询权限(x):允许你在目录中进行查找和使用 cd命令把工作目录放到它这里。第 10 页4.7修改文件或目录权限二、LINUX 文件系统编程1.1、在 VMware运行 Linux(CentOS),并打开 Terminal1.2、新建 eaxm.c文件,并使用 C语言进行编程第 11 页1.3、编译文件“exam.c”1.4、执行“exma.c”并观察输出结果第 12 页四、程序清单:注意加注释(包含关键字、方法、变量等) ,在每个模块前加注释#include#include#include#include#include#incl
7、ude#include#include#define MAX 128int chmd();int chmd ()int c;第 13 页mode_t mode=S_IWUSR;printf(“ 0. 0700n 1. 0400n 2. 0200 n 3. 0100n “); printf(“Please input your choice(0-3):“);scanf(“%d“,switch(c)case 0: chmod(“file1“,S_IRWXU);break;case 1: chmod(“file1“,S_IRUSR);break;case 2: chmod(“file1“,S_IWU
8、SR);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 bufferMAX;struct stat buf;char* path=“/bin/ls“;char* argv4=“ls“,“-l“,“file1“,NULL;while(1)printf(“*n“);printf(“0. 退出n“);printf(“1. 创建新文件n“);printf(“2. 写文件n“);pri
9、ntf(“3. 读文件n“);第 14 页printf(“4. 修改文件权限n“);printf(“5. 查看当前文件的权限修改文件权限n“);printf(“*n“);printf(“Please input your choice(0-6):“);scanf(“%d“, 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“);elseprintf(“fd = %dn“,fd); b
10、reak;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);第 15 页break; default:printf(“You have a wrong choice!n“); 五、测试结果(运行结果、结果分析)六、回答问题:1、程序分析本程序主要是通过调用系统中“文件的
11、建立、打开、读写、执行”等系统调用函数,实现对 Linux文件的各种操作,例如创建、读写、修改文件权限等操作。主要使用到以下几个系统调用函数:(1)创建新文件 fd=open(“file1“,O_RDWR|O_TRUNC|O_CREAT,0750);调用函数 open()打开文件,第一个参数为要打开的文件名,第二个参数为打开文件的方式,其中参数 O_CREAT表示当打开的文件不存在时,创建该文件,此时要加上第三个参数,第三个参数表创建文件后文件所具有的权限。该函数的返回值为打开文件的标识符,出错时 fd=-1; (2)写文件 num=read(0,buffer,MAX);调用 read()函数
12、,该函数的第一个参数为要读取的文件描述符,0 表示从输入流中读取文件,第二个参数表示将读取到的数据存放到 buffer缓冲区中,第三个参数为最大读取的字符个数。函数的返回值为实际读取到的字符数。 write(fd,buffer,num);调用 write()函数,该函数的第一个参数为要将数据写入的文件描述符,第二个参数要写入的缓冲区,第三个参数为写入的字符长度。第 16 页(3)读文件 read(fd,buffer,MAX);调用该函数,将文件标识符为 fd中的文件中的数据读取到 buffer缓冲中。 write(1,buffer,num); 调用该函数,将 buffer缓冲区中的数据写入到输
13、出流中,输出到显示器上。 (4)修改文件权限 chmod(“file1“,S_IRWXU); 调用该函数更改文件的权限,其中第一个参数为要更改权限的文件名,第二个参数为要修改到的权限,其中,S_IRWXU 表示具有执行、可读、可写权限,S_IRUSR 表示具有可读权限,S_IWUSR 表示具有可写权限,S_IXUSR 表示具有可执行权限。(5)查看当前文件的权限修改文件权限 char* path=“/bin/ls“; char* argv4=“ls“,“-l“,“file1“,NULL; execv(path,argv); 调用系统调用 execv()函数,表示调用/bin/ls ,实际相当于在终端上执行” ls l file1”,查看文件 file1的详细信息。2、解释 num=read(0,buffer,MAX); write(fd,buffer,num);代码的含义?num=read(0,buffer,MAX)表示从输入流中读取字符数据存放到缓冲区 buffer中,write(fd,buffer,num)表示将 buffer中的数据写入到文件表示符为 fd的文件中。3、系统调用 execv()的用途?该系统调用 execv()的用途是替换当前的进程执行终端上的指令。七、总结(实验效果分析、心得体会,遗留问题)