操作系统课程设计linux下的二级文件系统方案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学生课程设计报告
实验课名称:操作系统
实验项目名称:文件系统设计
专业名称:计算机科学与技术
班级:-----------
学号:-----------
学生姓名:-----------
教师姓名:-----------
2014 年 6 月 30 日
一、课程设计的目的..........................
二、课程设计的内容及要求................... 内容.......................................... 要求..........................................
三、实现原理.................................
四、关键算法实现流程图 ..................... 流程图........................................ 关键算法......................................
五、软件运行环境及限制 ..................... 六.结果输出及分析.......................... 七.心得体会.................................
一.课程设计的目的
本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让我更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了我的动手能力。

二.课程设计的内容及要求
1.实验内容
通过一个简单的二级文件系统设计,加深对文件系统的内部功能以及内部实现的理解。

要求模拟采用二级目录结构的磁盘文件系统的文件操作,能实现以下几条命令,用输入命令来模拟用户程序中调用的文件操作:
Login 用户登录
Dir 列文件目录(列出文件名、物理地址、保护码和文件长度)
Create 创建文件
Delete 删除文件
Open 打开文件
Close 关闭文件
Read 读文件
Write 写文件
源文件可以进行读写保护
2.实验要求
文件系统管理中用到的数据结构有:
①首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

②用户创建的文件,可以编号存储于磁盘上。

如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。

三.实现原理
首先,实现Login用户登录,(用户名:lhx密码:12358)必须登录成功才能进入文件系统进行查看,进入后,通过树状展示文件目录(默认文件目录是\home\lhx\kefile),利用命令行的方式进行注册、登录、各种各样的文件操作。

四.关键算法实现流程图
流程图:
1.用户登录功能的实现typedef struct userMsg{
char loginName[20];
char loginPasswd[20];
}UserMsg;
int login(char* name,char* passwd){
UserMsg um;
int count = 0,size = sizeof(UserMsg),nres,pres;
int fd = open("/home/lhx/study/kefile/login.dat",O_RDONLY);
if(fd == -1){
return -1;
}
while(1)
{
if(read(fd,&um,size) < size){
return -1;
}
nres = strcmp(name,um.loginName);
pres = strcmp(passwd,um.loginPasswd);
if(nres==0 && pres==0){
return 1;
}
if( nres == 0 && pres != 0){
return 0;
}
count++;
lseek(fd,SEEK_SET,size*count);
}
lseek(fd,SEEK_SET,0);
close(fd);
}
2.用户注册具体实现
int regist(char* name,char* passwd){
UserMsg um;
int count = 0,size = sizeof(UserMsg);
int fd = open("/home/lhx/study/kefile/login.dat",O_WRONLY|O_APPEND);
if(fd == -1){
return -1;
strcpy(um.loginName,name);
strcpy(um.loginPasswd,passwd);
lseek(fd,SEEK_END,0);
count = write(fd,&um,size);
if(count != size)
{
return -1;
}
return 1;
}
3.查看目录下文件
int listdtl(char* pname){
struct dirent** dlist;
int tmp,count;
char fpath[50],*fname;
count = scandir(pname,&dlist,NULL,alphasort);
if(count == -1)return -1;
printf("%10s\t%10s\t%10s\t%10s\t%10s\n","编号","类型","所有者ID","大小","文件名");
for(tmp = 0;tmp < count;tmp++)
{
struct stat st;
sprintf(fpath,"%s/%s",pname,dlist[tmp]->d_name);
stat(fpath,&st);
switch(dlist[tmp]->d_type){
case DT_DIR:
fname = "目录";
break;
case DT_LNK:
fname = "软链接";
break;
case DT_BLK:
fname = "块设备";
break;
case DT_REG:
fname = "普通文件";
break;
default:
fname = "其他类型";
break;
}
printf("%10lu\t%10s\t%10u\t%10lu\t%10s\n",st.st_ino,fname,st.st_uid,st.st_size,dlist[tm p]->d_name);
}
return 0;
}
4.文件创建、目录创建、目录删除、文件删除等实现
if(strcmp(resbuf,"create")==0)
{
int mode = atoi(pbuf);
if(mode == 0){
printf("无法识别的文件权限\n");
continue;
}
filedesc = creat(ubuf,tentoe(mode));
if(filedesc == -1){
printf("创建失败,该文件已存在\n");
}else{
printf("创建成功\n");
}
close(filedesc);
}else if(strcmp(resbuf,"type") == 0){
filedesc = open(ubuf,O_RDONLY);
if(filedesc == -1){
printf("该文件不存在!\n");
}else{
char buf[1025];
int count;
printf("'%s'文件的内容:\n",ubuf);
while(1){
count = read(filedesc,buf,1024);
if(count == 0){
break;
}
buf[count] = 0;
printf("%s",buf);
}
}
}else if(strcmp(resbuf,"delete") == 0){
filedesc = unlink(ubuf);
if(filedesc != 0){
printf("删除失败,文件可能不存在\n");
}else{
printf("删除文件'%s'成功\n",ubuf);
}
}else if(strcmp(resbuf,"mkdir") == 0){
filedesc = mkdir(ubuf,0751);
if(filedesc != 0){
printf("创建目录失败,目录可能已经存在了\n");
}else{
printf("创建目录'%s'成功\n",ubuf);
}
}else if(strcmp(resbuf,"rmdir") == 0){
filedesc = rmdir(ubuf);
if(filedesc != 0){
printf("删除目录失败,目录可能不存在或者目录非空\n");
}else{
printf("删除目录'%s'成功\n",ubuf);
}
}else if(strcmp(resbuf,"cd") == 0){
char dpath[50];
sprintf(dpath,"%s%s",upath,ubuf);
strcpy(upath,dpath);
filedesc = chdir(dpath);
if(filedesc != 0){
printf("更改工作目录失败!\n");
}else{
printf("当前工作目录:%s\n",dpath);
}
}else if(strcmp(resbuf,"dir") == 0){
if(strcmp(ubuf,"-nl") == 0){
DIR* dir;
struct dirent* drt;
dir = opendir(upath);
while(1){
drt = readdir(dir);
if(drt == NULL){
break;
}
printf("%s\t",drt->d_name);
}
printf("\n");
closedir(dir);
}else if(strcmp(ubuf,"-l") == 0){
listdtl(upath);
}else{
printf("不能识别的选项'%s'!\n",ubuf);
continue;
}
}else{
printf("未能识别的命令,请核对!\n");
}
五.软件运行环境及限制
1.运行环境
运行环境:linux
使用语言:c语言
编程工具:Kate
2.具体演示
2.1注册新用户 lxc密码12358
2.2 登录文件系统 lxc 密码12358
2.3 创建文件1.c并查看当前目录下的文件信息
2.4创建新目录 dirc
2.5 删除目录 dirc
2.6 查看文件1.c的内容
2.7删除文件 1.c
七.心得体会
操作系统课程设计,自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识与掌握。

比如对树的展示有了很好的学习,对二级文件系统也有了很好的了解,如何解决实现里面功能的各种问题。

通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。

附件(代码)
mfun.h
#ifndef _MFUN_H_
#define _MFUN_H_
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <dirent.h>
typedef struct userMsg{
char loginName[20];
char loginPasswd[20];
}UserMsg;
int login(char* name,char* passwd){
UserMsg um;
int count = 0,size = sizeof(UserMsg),nres,pres;
int fd = open("/home/lhx/study/kefile/login.dat",O_RDONLY);
if(fd == -1){
return -1;
}
while(1)
{
if(read(fd,&um,size) < size){
return -1;
}
nres = strcmp(name,um.loginName);
pres = strcmp(passwd,um.loginPasswd);
if(nres==0 && pres==0){
return 1;
}
if( nres == 0 && pres != 0){
return 0;
}
count++;
lseek(fd,SEEK_SET,size*count);
}
lseek(fd,SEEK_SET,0);
close(fd);
}
int regist(char* name,char* passwd){
UserMsg um;
int count = 0,size = sizeof(UserMsg);
int fd = open("/home/lhx/study/kefile/login.dat",O_WRONLY|O_APPEND);
if(fd == -1){
return -1;
}
strcpy(um.loginName,name);
strcpy(um.loginPasswd,passwd);
lseek(fd,SEEK_END,0);
count = write(fd,&um,size);
if(count != size)
{
return -1;
}
return 1;
}
int tentoe(int num){
int res;
if(num > 999 || num <0){
return -1;
}
res = 64*num/100 + 8*(num/10%10) +num%10;
return res;
}
int listdtl(char* pname){
struct dirent** dlist;
int tmp,count;
char fpath[50],*fname;
count = scandir(pname,&dlist,NULL,alphasort);
if(count == -1)return -1;
printf("%10s\t%10s\t%10s\t%10s\t%10s\n","编号","类型","所有者ID","大小","文件名");
for(tmp = 0;tmp < count;tmp++)
{
struct stat st;
sprintf(fpath,"%s/%s",pname,dlist[tmp]->d_name);
stat(fpath,&st);
switch(dlist[tmp]->d_type){
case DT_DIR:
fname = "目录";
break;
case DT_LNK:
fname = "软链接";
break;
case DT_BLK:
fname = "块设备";
break;
case DT_REG:
fname = "普通文件";
break;
default:
fname = "其他类型";
break;
}
printf("%10lu\t%10s\t%10u\t%10lu\t%10s\n",st.st_ino,fname,st.st_uid,st.st_size,dlist[tm p]->d_name);
}
return 0;
}
#endif
file.c
#include "mfun.h"
#include <errno.h>
int isLogin;
int main()
{
char resbuf[20],ubuf[20],pbuf[20],upath[50];
printf("------文件系统演示课设------\n");
while(!isLogin){
printf("操作说明:\n");
printf("1:登陆格式: login [username] [password]\n");
printf("2:注册格式: regist [username] [password]\n");
printf("请输入命令:");
scanf("%s %s %s",resbuf,ubuf,pbuf);
if(strcmp(resbuf,"login") == 0){
int lres = login(ubuf,pbuf);
if(lres == -1){
printf("用户'%s'不存在,请核对信息或注册\n",ubuf);
continue;
}else if(lres == 0){
printf("密码与'%s'不匹配,请核对\n",ubuf);
continue;
}else{
printf("登陆成功\n");
isLogin = 1;
sprintf(upath,"/home/lhx/study/kefile/%s/",ubuf);
lres = chdir(ubuf);
if(lres!=0){
printf("进入目录失败\n");
printf("Error:%s\n",strerror(errno));
}else{
printf("当前工作目录:%s\n",upath);
}
system("clear");
}
}else if(strcmp(resbuf,"regist") == 0){
int rres = regist(ubuf,pbuf);
if(rres == -1){
printf("注册失败,请重试\n");
}else{
printf("注册成功,赶快登陆系统演示吧\n");
mkdir(ubuf,0741);
}
}else{
printf("您输入的命令无法识别,请重试\n");
}
}
printf("---------文件操作演示----------\n");
while(1){
int filedesc;
printf("--------------------------------------------------\n");
printf("创建文件:create [filename] [mode](eg:666)\n");
printf("查看文件内容:type [filename] -n\n");
printf("删除文件:delete [filename] -n\n");
printf("创建目录:mkdir [dirname] -n\n");
printf("删除目录:rmdir [dirname] -n\n");
printf("察看当前目录下的文件:dir [option](-l:detail,-nl) -n\n");
printf("进入目录:cd [dirname] -n\n");
printf("请输入操作命令:");
scanf("%s %s %s",resbuf,ubuf,pbuf);
if(strcmp(resbuf,"create")==0)
{
int mode = atoi(pbuf);
if(mode == 0){
printf("无法识别的文件权限\n");
continue;
}
filedesc = creat(ubuf,tentoe(mode));
if(filedesc == -1){
printf("创建失败,该文件已存在\n");
}else{
printf("创建成功\n");
}
close(filedesc);
}else if(strcmp(resbuf,"type") == 0){
filedesc = open(ubuf,O_RDONLY);
if(filedesc == -1){
printf("该文件不存在!\n");
}else{
char buf[1025];
int count;
printf("'%s'文件的内容:\n",ubuf);
while(1){
count = read(filedesc,buf,1024);
if(count == 0){
break;
}
buf[count] = 0;
printf("%s",buf);
}
}
}else if(strcmp(resbuf,"delete") == 0){
filedesc = unlink(ubuf);
if(filedesc != 0){
printf("删除失败,文件可能不存在\n");
}else{
printf("删除文件'%s'成功\n",ubuf);
}
}else if(strcmp(resbuf,"mkdir") == 0){
filedesc = mkdir(ubuf,0751);
if(filedesc != 0){
printf("创建目录失败,目录可能已经存在了\n");
}else{
printf("创建目录'%s'成功\n",ubuf);
}
}else if(strcmp(resbuf,"rmdir") == 0){
filedesc = rmdir(ubuf);
if(filedesc != 0){
printf("删除目录失败,目录可能不存在或者目录非空\n");
}else{
printf("删除目录'%s'成功\n",ubuf);
}
}else if(strcmp(resbuf,"cd") == 0){
char dpath[50];
sprintf(dpath,"%s%s",upath,ubuf);
strcpy(upath,dpath);
filedesc = chdir(dpath);
if(filedesc != 0){
printf("更改工作目录失败!\n");
}else{
printf("当前工作目录:%s\n",dpath);
}
}else if(strcmp(resbuf,"dir") == 0){
if(strcmp(ubuf,"-nl") == 0){
DIR* dir;
struct dirent* drt;
dir = opendir(upath);
while(1){
drt = readdir(dir);
if(drt == NULL){
break;
}
printf("%s\t",drt->d_name);
}
printf("\n");
closedir(dir);
}else if(strcmp(ubuf,"-l") == 0){
listdtl(upath);
}else{
printf("不能识别的选项'%s'!\n",ubuf);
continue;
}
}else{
printf("未能识别的命令,请核对!\n");
}
}
return 0;
}。

相关文档
最新文档