操作系统+文件管理+部分代码

操作系统实习 1
1. 引言 2
1.1 设计目的 2
1.2实验内容 2
1.3 系统开发 运行环境 3
二 系统分析设计 3
2.2 基本原理 3
2.3 数据结构设计 4
2.4 程序流程图 5
三 程序代码以及运行结果 5
四 实习心得体会 10
五 参考文献 11

1. 引言
1.1 设计目的
通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 。
1.2实验内容
为linux系统设计一个简单的二级文件系统。要求做到以下几点:
(1)可以实现下列几条命令(至少4条);
dir 列文件目录
create 创建文件
delete 删除文件
open 打开文件
close 关闭文件
read 读文件
write 写文件
(2)列目录时要列出文件名、物理地址、保护码和文件长度;
(3)源文件可以进行读写保护。
提示:
(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。如file0,file1,file2...并以编号作为物理地址,在目录中进行登记
1.3 系统开发 运行环境
Windows XP 系统, Visual C++ 6.0
二 系统分析设计
2.2 基本原理
本系统是模拟实现多用户多的文件系统,在系统出现登录后 ,输入用户与口令,在用户登录系统后,可以添加2个普通用户。普通用户的命令与系统管理员的系统命令具体实现是一样的。此模拟系统提供了10个命令,并根据命令的含义与要求,用C/C++编程来完成所有具体操作。该系统可以模拟完成用户的登陆和验证,新建文件,打开文件,读文件,写文件,关闭文件,删除文件,查看文件,退出系统,注销用户,切换用户等系统功能。

2.3 数据结构设计
系统管理员
typedef struct user //系统管理员
{ char name[5] ; // 登录用户名
char password[10] ; // 登录密码
}user;
用户文件目录
struct UFD
{ char fname[5];//文件名
char proper[2];//文件属性 ,R或RW
int length;//记录长度
int addr;//文件地址
};
用户已打开文件表
struct UOF
{
char fname[5];//文件名
char proper[2];//文件属性,r或rw
int length;//记录长度
char state[5]; //状态: new, open
int read; //读指针
int write; //写指针
};
主文件目录
struct MFD
{ char Username[5];//用户名
struct UFD UserDirec[L];//用户文件目录
struct UOF OpenUser[S];//已打开文件目录
int count; //每个用户拥有

的存在的文件计数
} MFD[N];

2.4 程序流程图



失败 重新登录


成功
用户命令



三 程序代码以及运行结果
系统管理员登陆以及验证:
bool login(char *name, char *pwd )
{
if( (strcmp(name, https://www.360docs.net/doc/a415942854.html,)==0) && (strcmp(pwd, admin.password)==0))
{ return true; }
return false;
}

创建新用户
bool NewUser(char user[])
{ int i=0;
while(strcmp(MFD[i].Username,"")!=0&&(i{ i++; }
if(i>=N){ //如果用户数已满
cout<<"用户数已满. 你必须删除一个用户才继续新建用户"<return 0;
}
else{ //如果用户数未满,则建立新用户
strcpy(MFD[i].Username,user);
NOU++;//用户数加1
cout<<" 用户 "<cout<<" 系统现有的用户数 : "<return 1;
}
}


注销用户
void Logout(int a)
{ //注销用户,清除所有文件的登记栏
string str;
char temp[5]="";
for(int i=0;i{ //对 UFD中的文件名MFD[a].UserDirec[i].fname进行处理
str=static_cast(MFD[a].UserDirec[i].fname);
strcpy(MFD[a].UserDirec[i].fname,str.substr(0,4).c_str());

for(int j=0;j{//对UOF中的文件名UOF[i].fname进行处理
str=static_cast(MFD[a].OpenUser[j].fname);
strcpy(MFD[a].OpenUser[j].fname,str.substr(0,4).c_str());
//清除UOF中信息
if(strcmp(MFD[a].UserDirec[i].fname,MFD[a].OpenUser[j].fname)==0)
{ strcpy(MFD[a].OpenUser[j].fname,""); //清除UOF中文件名
strcpy(MFD[a].OpenUser[j].proper,"");//清除UOF中文件属性
MFD[a].OpenUser[j].length=0; //清除UOF中记录长度
strcpy(MFD[a].OpenUser[j].state,""); //清除UOF中文件状态
MFD[a].OpenUser[j].read=0; //清除UOF中读指针
MFD[a].OpenUser[j].write=0; //清除UOF中写指针
}
}
//清除UFD中信息
strcpy(MFD[a].UserDirec[i].fname,"");//清除UFD中文件名
strcpy(MFD[a].UserDirec[i].proper,"");//清除UFD中文件属性
MFD[a].UserDirec[i].length=0;//清除UFD中记录长度
MFD[a].UserDirec[i].addr=0; //清除UFD中文件地址
}

strcpy(temp, MFD[a].Username);
strcpy(MFD[a].Username,"");//清除MFD中的用户


MFD[a].count=0; //该用户下的文件数清零
NOU--;//用户数减1
cout<<" 用户 "<cout<<" 系统当前用户数: "<}


新建文件
void Create(int a){
int i=0;
char filename[5];//文件名
char property[3];//文件属性
char temp[2]; //文件属性的临时变量
string str;//临时变量
Re:
cout<<"请输入创建文件名(长度为 4) 文件属性(r,rw):"<cout<<"文件名: "; //输入要创建的文件名
cin>>filename;
if(strlen(filename)>4) goto Re;//如果文件名长度不符合要求,则要求重新输入

loop:
cout<<"文件属性(r,rw) :";//输入文件属性,读或是读写
cin>>property;
strcpy(temp,property);//将属性字符串 赋值给temp
if(!(strcmp(temp,"rw")==0||strcmp(temp,"r")==0))//检查属性是否正确
{ cout<<"文件属性设置错误. 请重新设置: r or rw"<goto loop;
}
//对文件名filename进行处理
str=static_cast(filename);
strcpy(filename,str.substr(0,4).c_str());

//对MFD[a].UserDirec[i].fname文件名进行处理
str=static_cast(MFD[a].UserDirec[i].fname);
strcpy(MFD[a].UserDirec[i].fname,str.substr(0,4).c_str());
while((strcmp(MFD[a].UserDirec[i].fname,filename)!=0)&&(i{ i++;
str=static_cast(MFD[a].UserDirec[i].fname);
strcpy(MFD[a].UserDirec[i].fname,str.substr(0,4).c_str());
}
if(i>=L){ //无重名文件
if(MFD[a].count>=L)//如果用户文件目录UFD已满,则提示文件满的信息
{cout<<" 用户"<<<" 文件目录UFD已满."<}
//当用户文件目录UFD未满时
else{
int j=0;
int k=0;
while(strcmp(MFD[a].UserDirec[j].fname,"")!=0&&(j{j++; }
MFD[a].count++; //用户的文件计数器加1
strcpy(MFD[a].UserDirec[j].fname,filename); //UFD中登记文件名
MFD[a].UserDirec[j].length=Record;//UFD记录长度
strcpy(MFD[a].UserDirec[j].proper,temp);//UFD中文件属性
srand((unsigned)time(NULL)); //产生随机数
i=rand()%100;// 找一磁盘空闲块并赋值给i
MFD[a].UserDirec[j].addr=i;//在UFD登记栏中置文件地址为i
//提示文件在UFD中

建立成功
cout<<" 文件: "<
while(strcmp(MFD[a].OpenUser[k].fname,"")!=0&&(k{k++; }
//如果用户已打开文件表UOF未满
if(kstrcpy(MFD[a].OpenUser[k].fname,filename); //UOF中文件名
MFD[a].OpenUser[k].length=Record;//UOF中记录长度
strcpy(MFD[a].OpenUser[k].proper, temp);//UOF中文件属性
strcpy(MFD[a].OpenUser[k].state,"new");//修改状态为建立
MFD[a].OpenUser[k].write=i;//修改写指针为i
//提示文件在UOF中建立成功
// cout<<" 文件: "<} //如果用户已打开文件表UOF已满,提示文件满的信息
else{ //
cout<<"用户已打开文件表UOF已满. "<}
}
}
else //提示文件同名,不能建立
{ cout<<"文件同名 不能建立"<}

打开文件

写文件

读文件

删除文件

系统帮助命令

四 实习心得体会
这次操作系统实习为期三周的学习时间,虽然时间比较短,但是还是有点收获的。实习之前,是操作系统课程学习,学习的都是课本的理论知识。在没有接触操作系统课程之前,个人的见识真是少啊。 我以为操作系统就是 Windows XP 这么一种操作系统,还没想到操作系统竟然还有这么多的呢。
课堂上讲的操作系统就是Linux 操作系统,可是课本的理论知识学习的比较模糊,很多概念都不理解。经过这次操作系统实习之后,个人在虚拟机里 不断的练习 Linux系统各种命令。由于个人这次实习,所选的题目是:文件系统模拟设计,所以个人在这方面操作比较多,经常动手练习那些Linux系统常用的文件系统命令,逐渐熟悉理解了这个文件系统的各种命令。不过,对于Linux系统 还有很多知识是不懂的,如果将来打算从事Linux系统软件开发的哇,那么还是需要慢慢学习Linxu系统的。
通过这次实习,促使个人开始接触了解这个Linux系统,也对Linux系统有了一点兴趣。

相关文档
最新文档