当前位置:文档之家› 实验6:文件系统

实验6:文件系统

实验6:文件系统
实验6:文件系统

实验6:文件系统

要求:

1、设计一个有m个用户的文件系统,每个用户最多可保存一个文件。

2、规定用户在一次运行中只能打开K个文件。

3、系统能检查键入命令的正确性,出错时应能显示出错原因。

4、对文件应能设置保护措施,如只能执行、允许读、允许写等。

5、对文件的操作设计提供一套文件操作:CREATE建立文件;DELETE删除文

件;OPEN打开文件;CLOSE关闭文件;READ读文件;WRITE写文件。

6、文件系统采用二级文件目录结构,第一级为文件目录MFD,第二级为用户

文件目录UFD,如下表所示:

主文件目录

用户名用户文件目录地址用户文件目录

文件名状态(打开/建立)指针

提示:

可采用以为数组模拟位示图来表示存储空间的分配情况。

源程序代码:

#if !defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INC LUDED_)

#define

AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

extern int disk_block[10000];

extern int disk_empty;

typedef struct UFD//存储文件信息

{

char name[10];

int attribute;//文件属性

int length;

int a[10];

int *p1;//一级索引

int (*p2)[100];//二级索引

struct UFD *next;// 指向文件链表中此文件结点的下一个结点}UFD;

typedef struct DIR//存储目录信息

{

DIR *above;// 指向目录链表中此目录结点的上一个结点

char name[10];

int length;

DIR *next;//指向目录链表中引目录结点的下一个结点

UFD *File_head;//此目录下文件链表的头指针

DIR *Dir_head;//此目录下目录链表的头指针

}DIR;

class Cuse//定义管理用户目录的类

{

DIR *now;//当前目录

UFD *Fhead;//文件链表的头结点

DIR *Dhead;//目录链表的头结点

char code[10];//用户密码

char name[10];//用户名称

int length;//用户所使用空间大小

int status;//此对象是否已经分配给用户

public:

void set_status(int);

int dele_user();

int dis_file();//显示文件所占外存块号

int dis_dir(DIR *d);//实现显示当前路径的函数

int get_length();

char const*get_name();

char const*get_code();

int get_status();

int set_user(char *,char *);//设置用户名与密码

DIR *get_now();

int dele_file(UFD *f);//删除文件的具体实现部分

int dele_dir(DIR*);//删除目录的具体实现部分

Cuse();

~Cuse();

int goback();//返回上一级目录

int dis_now();//显示当前目录的信息

int new_file();

int new_dir();

int open_dir();

int open_file();

int first_dele_file();//实现删除文件的前部分工作

int first_dele_dir();//实现删除目录的前部分工作

int set_code();

};

class Cdisk

{

public:

Cuse user[5];

char code[10];

int dis_disk();

int first_dele_user();

int dele_user(int);

int new_user();//查看当前用户信息与外存空间使用情况int set_code();

int login();//用户登录

Cdisk();

virtual ~Cdisk();

};

#endif

// !defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCL UDED_)

#include

#include

#include

int disk_block[10000];

int disk_empty;

Cdisk::Cdisk()

{

int i=0;

char code[10]="123456";

for(i=0;i<10000;i++)

disk_block[i]=0;

this->user[0].set_user("student","123");

disk_empty=10000;

cout.setf(ios::left);

}

Cdisk::~Cdisk()

{

}

int Cdisk::dele_user(int i)

{

Cuse C;

C=user[i];

user[i].dele_user();

return 1;

}

int Cdisk::dis_disk()

{

int i=0;

cout<

for(i=0;i<5;i++)

if(user[i].get_status()==1)

cout<

cout<<"已用空间:"<<10000-disk_empty<

return 1;

}

int Cdisk::login()

{

char n[10],c[10];

int i;

cout<<"请输入用户名与密码,中间用空格隔开"<

cin>>n>>c;

for(i=0;i<5;i++)

{

if(user[i].get_status())

if(!strcmp(n,user[i].get_name()))

if(!strcmp(c,user[i].get_code()))

{

cout<<"登录成功"<

cout<<"欢迎"<

return i;

}

else

{

cout<<"密码错误"<

return -1;

}

}

cout<<"没有这个用户"<

return -1;

}

int Cdisk::set_code()

{

char temp1[10],temp2[10];

cout<<"请输入原密码"<

cin>>temp1;

if(strcmp(temp1,code))

{

cout<<"原密码错误"<

return 0;

}

while(1)

{

cout<<"请输入请新密码"<

cin>>temp1;

cout<<"请再输入新密码"<

cin>>temp2;

if(strcmp(temp1,temp2))

{

cout<<"两次输入不一致"<

break;

}

cout<<"密码设置成功"<

strcpy(code,temp1);

}

return 1;

}

int Cdisk::new_user()

{

char n[10],c[10];

int i=0;

for(i=0;i<5;i++)

if(user[i].get_status()==0)

break;

if(i==5)

{

cout<<"已经达到最大用户个数,不能创建"<

return 0;

}

user[i].set_status(1);

cout<<"请输入用户名称"<

cin>>n;

cout<<"请输入密码"<

cin>>c;

user[i].set_user(n,c);

cout<<"用户创建成功"<

return 1;

}

int Cdisk::first_dele_user()

{

char n[10],c;

int i;

cout<<"请输入你要删除的用户的名称"<

cin>>n;

for(i=0;i<5;i++)

if(!strcmp(user[i].get_name(),n)&&user[i].get_status())

break;

if(i==5)

{

cout<<"此用户不存在"<

return 0;

}

cout<<"确认删除此用户?确认请按Y,取消请按其他键"<

cin>>c;

if(c!='Y')

{

cout<<"已经取消删除"<

return 0;

}

this->dele_user(i);

cout<<"用户删除成功"<

return 1;

}

Cuse::Cuse()

{

status=0;

length=0;

now=0;

Fhead=0;

Dhead=0;

}

Cuse::~Cuse()

{

disk_empty+=length;

length=0;

UFD *f=Fhead;

DIR *d=Dhead;

while(f!=0)

{

if(f->next==0)

{

this->dele_file(f);

f=0;

break;

}

while(f->next->next!=0)

f=f->next;

this->dele_file(f->next);

f->next=0;

f=Fhead;

}

while(d!=0)

{

if(d->next==0)

{

this->dele_dir(d);

d=0;

break;

}

while(d->next->next!=0)

d=d->next;

this->dele_dir(d->next);

d->next=0;

d=Dhead;

}

}

int Cuse::new_file()

{

int i=0,j=0;

UFD *p=0;

p=new UFD;//开辟一个新的文件结构体

if(p==0)//如果p已经指向空了,说明没有空间了

{

cout<<"无可用内存空间,创建文件失败"<

return 1;

}

cout<<"请输入建立的文件的名称,长度,属性(0:只读,1:读写)"<

cin>>p->name>>p->length>>p->attribute;//初始化一些文件的参数

if(p->length>disk_empty)//如果我们需要的文件长度大于当前系统尚存的空间,则无法创建

{

cout<<"作业太大,当前硬盘可用空间为:"<

delete p;

return 0;

}

for(i=0;ilength&&i<10;i++)//如果满足要求,并且i小于10个结点那么开始分配

for(j;j<10000;j++)

if(disk_block[j]==0)

{

p->a[i]=j;

disk_block[j]=1;//分配后将此块设置为1,表示已经被使用

j++;

break;

}

p->p1=0;

p->p2=0;

if(p->length>10)//一级索引的实现

//长度大于10

{

p->p1=new int[100];

for(i=10;ilength&&i<110;i++)

for(j;j<10000;j++)

/*为当前的这个文件分配空间,使用位示图法*/ if(disk_block[j]==0)

{

(p->p1)[i-10]=j;

disk_block[j]=1;

j++;

break;

}

if(p->length>110)//文件长度大于110,使用二级索引实现

{

p->p2=new int[100][100];

for(i=110;ilength;i++)

for(j;j<10000;j++)

/*采用位示图法分配空间*/

if(disk_block[j]==0)

{

int m=(i-110)/100;//得到行号

int k=(i-110)%100;//得到列号

p->p2[m][k]=j;

disk_block[j]=1;

j++;

break;

}

}

}

return 0;

}

int Cuse::new_dir()

{

DIR *p,*h;

cout<<"请输入新目录的名字"<

p=new DIR;//p指向这个新建的目录DIR(新的结构体)

cin>>p->name;//输入目录的名字

/*初始化这个目录的属性*/

p->Dir_head=0;

p->length=0;

p->File_head=0;

if(now==0)//如果当前没有目录存在

h=Dhead;//则将该指针h指向目录的头部

else

h=now->Dir_head;//否则,则使h指向当前目录链表的头while(h!=0)//如果当前已经有目录存在了

{

if(!strcmp(h->name,p->name))//查看目录是否存在

{

cout<<"此目录已经存在"<

return 0;

}

h=h->next;//指向下一个结点,继续判断

}

/*将我们需要创建的目录插入到当前的目录链表中*/

if(now==0)//当前没有目录存在,创建的目录为第一个

{

p->above=0;//上一个结点指空

p->next=Dhead;//后继结点指向头,实现双向链表的功能

Dhead=p;

}

else

{

p->above=now;

p->next=now->Dir_head;

now->Dir_head=p;

}

cout<<"目录创建成功"<

return 1;

}

int Cuse::goback()

{

if(now==0)

{

cout<<"已经是主目录,不能向上"<

return 0;

}

now=now->above;

return 1;

}

int Cuse::open_dir()

{

char name[10];

DIR *p;

if(now==0)

p=Dhead;

else

p=now->Dir_head;

cout<<"请输入你要打开的目录名称"<

cin>>name;

int flag=0;

while(p!=0)

{

if(strcmp(p->name,name)==0)

{

now=p;

return 1;

}

p=p->next;

}

cout<<"当前目录没有这个目录"<

return 0;

}

int Cuse::first_dele_file()

{

char temp[10];

cout<<"请输入你要删除的文件名"<

cin>>temp;

UFD *f=Fhead;

UFD *above=0;

if(now!=0)

f=now->File_head;

while(f!=0)

{

if(!strcmp(f->name,temp))

break;

above=f;

f=f->next;

}

if(f==0)

{

cout<<"此文件不存在"<

return 0;

}

disk_empty+=f->length;

if(now==0)

{

if(f==Fhead)

Fhead=Fhead->next;

else

above->next=f->next;

}

else

{

DIR *d=now;

while(d!=0)//修改删除文件后各级目录的大小

{

d->length-=f->length;

d=d->above;

}

if(f==now->File_head)//删除文件结点

now->File_head=now->File_head->next;

else

above->next=f->next;

}

length-=f->length;

this->dele_file(f);

cout<<"删除成功"<

return 1;

}

int Cuse::dele_file(UFD *f)

{

int i=0,m;

for(i=0;i<10&&ilength;i++)

{

m=f->a[i];

disk_block[m]=0;

}

if(f->p1!=0)

{

for(i=10;i<110&&ilength;i++)

{

m=f->p1[i-10];

disk_block[m]=0;

}

delete[](f->p1);

}

if(f->p1!=0)

{

for(i=110;ilength;i++)

{

m=(f->p2)[(i-110)/100][(i-110)%100];

disk_block[m]=0;

}

delete[](f->p2);

delete f;

}

f=0;

return 1;

}

int Cuse::first_dele_dir()

{

char n[10];

char c;

DIR *p,*above=0;

if(now!=0)

p=now->Dir_head;

cout<<"请输入你要删除的目录的名称"<

cin>>n;

while(p!=0)

{

if(!strcmp(p->name,n))

break;

above=p;

p=p->next;

}

if(p==0)

{

cout<<"没有这个目录"<

return 0;

}

cout<<"你确定要删除当前目录及此目标下面的所有信息吗?按0确定,按其他键取消"<

cin>>c;

if(c!='0')

return 0;

disk_empty+=p->length;

if(now==0)

{

if(p==Dhead)

Dhead=Dhead->next;

else

above->next=p->next;

}

else

{

if(p==now->Dir_head)

now->Dir_head=now->Dir_head->next;

else

above->next=p->next;

above=now;

while(above!=0)//修改删除目录后各级目录的大小

{

above->length-=p->length;

above=above->above;

}

}

length-=p->length;

this->dele_dir(p);

p=0;

cout<<"删除成功"<

return 1;

}

int Cuse::dele_dir(DIR *p)

{

int flag=0;

DIR *d=p->Dir_head;

UFD *f=p->File_head;

if(f!=0)

{

while(p->File_head->next!=0)//删除此目录下的文件

{

f=p->File_head;

while(f->next->next!=0)//寻找最后一个文件结点

f=f->next;

this->dele_file(f->next);

f->next=0;

}

if(p->File_head->next==0)

{

this->dele_file(p->File_head);

p->File_head=0;

}

}

if(d!=0)

{

while(p->Dir_head->next!=0)//删除此目录下的目录

{

d=p->Dir_head;

while(d->next->next!=0)//寻找最后一个文件结点

d=d->next;

this->dele_dir(d->next);//递归调用此函数

d->next=0;

}

if(p->Dir_head->next==0)

{

this->dele_dir(p->Dir_head);

p->Dir_head=0;

}

}

delete p;

p=0;

return 1;

}

int Cuse::dis_now()

{

DIR *d=Dhead;

UFD *f=Fhead;

if(now!=0)

{

d=now->Dir_head;

f=now->File_head;

}

if(d==0&&f==0)

{

cout<<"当前目标为空目录"<

return 0;

}

cout<<"当前目录大小:";

if(now==0)

cout<

else

cout<length;

cout<

if(d==0)

cout<<"当前目录下没有目录"<

else

{

cout<<"当前目录下包含如下目录"<

cout<

while(d!=0)

{

cout<name<length<

d=d->next;

}

}

文件系统实验报告

嵌入式系统实验报告(二) --嵌入式文件系统的构建 138352019陈霖坤一实验目的 了解嵌入式操作系统中文件系统的类型和作用 了解JFFS2文件系统的优点及其在嵌入式系统中的作用 掌握利用Busybox软件制作嵌入式文件系统的方法 掌握嵌入式linux文件系统的挂载过程 二实验内容与要求 编译BusyBox,以BusyBox为基础,构建一个适合的文件系统; 制作ramdisk文件系统映像,用你的文件系统启动到正常工作状态; 研究NFS作为根文件系统的启动过程。 三Busybox介绍 BusyBox最初是由Bruce Perens在1996年为Debian GNU/Linux安装盘编写的,其原始构想是希望在一张软盘上能放入一个开机系统,以作为急救盘和安装盘。后来它变成了嵌入式Linux设备和系统和Linux发布版安装程序的实质标准,因为每个Linux可执行文件需要数Kb的空间,而集成两百多个程序的BusyBox可以节省大量空间。Busybox集成了包括mini-vi编辑器、/sbin/init、文件操作、目录操作、系统配置等应用程序。 Busybox支持多种体系结构,可以选择静态或动态链接,以满足不同需要。 四linux文件系统 文件系统是对一个存储设备上的数据和元数据进行组织的机制,linux文件系统接口设计为分层的体系结构,从而将用户接口层、文件系统实现层和操作存储设备的驱动程序分隔开。 在文件系统方面,linux可以算得上操作系统中的“瑞士军刀”。Linux支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统,而且对于使用标准的和比较奇特的文件系统以及开发文件系统来说,linux是极好的平台,这得益于linux内核中的虚拟文件系统(VFS,也称虚拟文件系统交换器)。 文件结构 Windows的文件结构是多个并列的树状结构,不同的磁盘分区各对应一个树。Linux的文件结构是单个的树,最上层是根目录,其它目录都从根目录生成。不同的linux发行版集

操作系统简单文件系统设计及实现

简单文件系统的设计及实现 一、实验目的: 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二、实验内容: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作 4、算法与框图 ?因系统小,文件目录的检索使用了简单的线性搜索。 ?文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ?程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD); 打开文件目录( AFD)(即运行文件目录) 文件系统算法的流程图如下

三、工具/准备工作: 在开始本实验之前,请回顾教科书的相关内容。并做以下准备: 1) 一台运行Windows 2000 Professional或Windows 2000 Server的操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企业版 四、实验要求: (1)按照学校关于实验报告格式的要求,编写实验报告(含流程图); (2)实验时按两人一组进行分组,将本组认为效果较好的程序提交检查。

实验六 文件系统设计结果

实验六文件系统设计 1.目的和要求 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 2.实验内容 为DOS系统设计一个简单的二级文件系统,可以实现下列几条命令DIR 列文件目录 CREATE 创建文件 DELETE 删除文件 MODIFY 修改文件 OPEN 打开文件 CLOSE 关闭文件 列目录时要列出文件名,物理地址,保护码和文件长度。 3.实验环境 ①PC兼容机 ②Windows、DOS系统、Turbo c 2.0 ③C语言 4.实验提示 ①首先应确定文件系统的数据结构:主目录、活动文件等。主目录文件的形式存放于磁盘,这样便于查找和修改。 主目录结构: Ufdname 用户名 Ufdfile 指向用户的活动文件 活动文件结构: Fpaddr 文件物理地址 Flength 文件长度 Fmode 文件属性(file mode:0-Read Only;1-Write Only;2-Read and Write(default)) Fname 文件名称 ②用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并

以编号作为物理地址,在目录中进行登记。

③本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录,在利用程序创建了文件系统后,可以在这个文件夹下查看到相关的内容。5.实验程序 #include "stdio.h" #include "string.h" #include "conio.h" #include "stdlib.h" #define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/ #define MAXCHILD 50 /*the largest child*/ #define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/ typedef struct /*the structure of OSFILE*/ { int fpaddr; /*file physical address*/ int flength; /*file length*/ int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write(default);*/ char fname[MAXNAME]; /*file name*/ } OSFILE; typedef struct /*the structure of OSUFD*/ { char ufdname[MAXNAME]; /*ufd name*/ OSFILE ufdfile[MAXCHILD]; /*ufd own file*/ }OSUFD; typedef struct /*the structure of OSUFD'LOGIN*/ { char ufdname[MAXNAME]; /*ufd name*/ char ufdpword[8]; /*ufd password*/ } OSUFD_LOGIN; typedef struct /*file open mode*/ { int ifopen; /*ifopen:0-close,1-open*/ int openmode; /*0-read only,1-write only,2-read and write,3-initial*/ }OSUFD_OPENMODE; OSUFD *ufd[MAXCHILD]; /*ufd and ufd own files*/ OSUFD_LOGIN ufd_lp;

Linux文件系统实验报告

黄冈师学院 提高型实验报告 实验课题文件系统的设计与实现(实验类型:□综合性 设计性□应用性) 实验课程操作系统原理 实验时间2015-2016 第二学期 学生何正发 专业班级软件工程1401 学号07

成绩: 一、实验目的和要求 1、熟悉操作系统设计的过程,巩固操作系统的基本知识,加深对操作原理、功能及各种不同的存储管理方法理解与应用; 2、学会运用各种语言、软件开发新软件的基本方法; 3、增强实际应用能力和动手操作能力。 二、实验条件 Win7 /Windows 8.1/Linux等操作系统,装有java、C、C++、C#等语言工具的环境。 三、实验原理分析 可以选择最佳适应算法,按照从小到大的次序组成空闲区自由链,当用户作业或进程申请一个空闲区时,存储管理 程序从表头开始查找,当找到第一个満足要求的空闲区时,停止查找。如果该空闲区大于请求表中的请求长 度,将减去请求长度后的剩余空闲区部分留在可用表中。回收时,从作链中删去要回收的作业块,同时在空 闲链中插入该作业大小的空闲区,并按顺序排列 四、实验方案或步骤 1、应用环境、需求分析 本模拟系统主要针对文件的管理和操作名主要有:创建用户、文件、文件夹,读文件,写文件,执行文件,关闭文件,删除用户、文件夹、文件的功能。 创建用户、文件、文件夹:在对系统发出操作命令之前必须先登录用户,然而登录之前必须创建该用户。在创建完后,可通过登录用户来创建文件和文件夹。在创建文件时可设置文件的属性和输入文件的容。 读文件:读取任何已创建的只读或读写文件的容;如果所要读的文件不是可读文件时,系统会显示该文件不可读;如果所读文件不存在,系统会显示文件不存在。 写文件用户可写或重写读写文件中的容,并保存文件中的重写容,以供下次读取;当所要写的文件不是可写的文件时,系统会显示该文件不可写;当所要写的文件并不存在时,系统会显示该文件不存在。

操作系统实验5文件系统:Linux文件管理

实验5 文件系统:Linux文件管理 1.实验目的 (1)掌握Linux提供的文件系统调用的使用方法; (2)熟悉文件和目录操作的系统调用用户接口; (3)了解操作系统文件系统的工作原理和工作方式。 2.实验内容 (1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:*********** 0. 退出 1. 创建新文件 2. 写文件 3. 读文件 4. 复制文件 5. 修改文件权限 6. 查看文件权限 7. 创建子目录 8. 删除子目录 9. 改变当前目录到指定目录 10. 链接操作 *********** 代码: #include #include #include #include #include #include #include #include void menu(void); void openfile(void); void writefile(void); void readfile(void); void copyfile(void); void chmd(void); void ckqx(void); void cjml(void); void scml(void); void ggml(void); void ylj(void); int main() { int choose; int suliangjin=1;

menu(); scanf("%d",&choose); while(choose!=0) { switch(choose) { case 1:openfile();break; case 2:writefile();break; case 3:readfile();break; case 4:copyfile();break; case 5:chmd();break; case 6:ckqx();break; case 7:cjml();break; case 8:scml();break; case 9:ggml();break; case 10:ylj();break; } menu(); scanf("%d",&choose); } return 0; } void menu(void) { printf("文件系统\n"); printf("1.创建新文件\n"); printf("2.写文件\n"); printf("3.读文件\n"); printf("4.复制文件\n"); printf("5.修改文件权限\n"); printf("6.查看文件权限\n"); printf("7.创建子目录\n"); printf("8.删除子目录\n"); printf("9.改变目前目录到指定目录\n"); printf("10.链接操作\n"); printf("0.退出\n"); printf("请输入您的选择...\n"); } void openfile(void) { int fd; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");

实验四 文件系统实验

实验四文件系统实验 一 . 目的要求 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二 . 例题: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 4、算法与框图: ①因系统小,文件目录的检索使用了简单的线性搜索。 ②文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ③程序中使用的主要设计结构如下: 主文件目录和用户文件目录( MFD、UFD) 打开文件目录( AFD)(即运行文件目录)

文件系统算法的流程图如下: 三 . 实验题: 1、增加 2~3个文件操作命令,并加以实现。(如移动读写指针,改变文件属 性,更换文件名,改变文件保护级别)。 #include #include #include #define getpch(type) (type*)malloc(sizeof(type)) int userNum=0; struct mdf {

FAT文件系统操作系统课程设计实验报告

操作系统课程设计之三 设计任务:模拟OS文件系统 在任一OS(Window或者Dos;也可以是在Linux下,但要求能将结果演示给老 师看)下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟OS 字 ,第 ⑤、每个目录实际能放下文件或子目录30项。 ⑸、文件系统空间分配: ①、第0个盘块(1k)存放磁盘信息(可以设定为格式说明“FAT32”、盘块大小,盘块数等 内容) ②、第1个盘块起,至125盘块,共125个盘块(125k)存放FAT内容 ③、第126、127(2个)盘块,存放位示图

④、从第128盘块至10000盘块,皆为数据(区)盘块,其逻辑编号从0开始,至 9872号数据盘块,即第0数据盘块为128号盘块,第1数据盘块为129号盘块,… ⑤、第0数据盘块(即128号盘块),存放根目录(同样只用一个盘块作根目录), 由于第0、1目录项为“.”(本目录), “..”(父目录),因此根目录下同样只能存放30个文件或目录,并且从第2个目录项开始。 ⑥、文件或子目录数据,放在第1数据盘块及以后的数据盘块中,由用户按需要使 用。 内容 ⑺、删除文件 #DelFile 文件名.扩展名,在文件所在的目录项中,将第一个字节变为0xE5,并同时修改FAT内容和位示图内容;如果文件不存在,给出出错信息 ⑻、文件拷贝 #CopyFile 老文件,新文件,为新文件创建一个目录项,并将老文件内容复制到新文件中,并同时修改FAT内容和位示图内容 ⑼、显示位示图内容

#ShowBitMP,将位示图内容(已有信息部分),显示在屏幕上(按十六进制)⑽、显示FAT内容 #ShowFAT,将FAT内容(已有信息部分),显示在屏幕上(按十六进制) 4、程序的总体流程为: ⑴、输出提示符#,等待接受命令,分析键入的命令; ⑵、对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令 关于对FAT表和MAP表的用法 1.当要用到数据块是,查询MAP表(因为只做比较查询即可),查询到的未用位置 置1,然后在FAT表上进行相应记录,在本程序做出的规定是,当文件夹FAT 表做-1,若是文件则按照FAT做对应的顺序记录,最后一块同样是-1结束,2.回收的时候,是按照FAT表的首项,做顺序置0,然后MAP也在相应位置置0

Linux文件系统实验

实验编号与实验名称: 文件系统实验 实验目的: 熟悉文件和目录的基本操作;了解Linux的/proc文件系统 实验内容及要求(详见实验讲义与实验指导书): 内容: 1)在/usr目录下创建一个目录usr_test和文本文件test,并建立一个test文件的链接 test02。通过修改test文件中的内容查看test和test02中内容的情况,并分析原因。 2)编写程序,从/proc文件中抽取内核参数(任意的2个参数即可,如CPU时钟速度信 息等) 3)实现文件的拷贝,即把一个文件内容复制到另一个文件 要求: 对于内容1),给出操作步骤和结果分析,需回顾第二次实验中练习过的Shell命令和教材中的文件和目录操作系统调用 对于内容2)和3)给出完整C语言代码或者代码截图和代码执行结果,可参考本文件“实验预读”中相关内容和教材P.149/266图4-5相关代码 实验用到的软件(:) VMware 实验内容及关键步骤(代码)Q2(60分) 1)在/usr目录下创建一个目录usr_test和文本文件test,并建立一个test文件的链接 test02。通过修改test文件中的内容查看test和test02中内容的情况,并分析原因。

分析:在linux系统中通过link连接就可以通过第三方的查询,通过link函数后test01被绑定给test02中,所以可以通过test02去查询。 2.编写程序,从/proc文件中抽取内核参数(任意的2个参数即可,如CPU时钟速度信息等)

3.实现文件的拷贝,即把一个文件内容复制到另一个文件

实验过程中遇到的问题解决办法与实验体会Q3(10分)得分: 评阅教师特殊评语: 评阅教师: 日期:

文件系统实验报告

实验二文件系统实验报告

一.实验简介 本实验要求在假设的I/O 系统之上开发一个简单的文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节。用户通过create, open, read 等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0 至L-1。I/O 系统利用内存中的数组模拟磁盘。 实际物理磁盘的结构是多维的:有柱面、磁道、扇区等概念。I/O 系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为0 至L .. 1,其中L 表示磁盘的存储块总数。实验中,我们可以利用字符数组ldisk[L][B] 构建磁盘模型,其中 B 表示每个存储块的长度。I/O 系统从文件系统接收命令,根据命令指定的逻辑块号把磁盘块的内容读入命令指定的内存区域,或者把命令指定的内存区域内容写入磁盘块。 我设计的文件系统拥有三个用户。 二.具体说明 1.文件系统的组织:磁盘的前k 个块是保留区,其中包含如下信息:位图和文件描述符。位图用来描述磁盘块的分配情况。位图中的每一位对应一个逻辑块。创建或者删除文件,以及文件的长度发生变化时,文件系统都需要进行位图操作。前k 个块的剩余部分包含一组文件描述符。每个文件描述符包含如下信息: ?文件长度,单位字节 ?文件分配到的磁盘块号数组。该数组的长度是一个系统参数。在实验中我们可以把它设置为一个比较小的数,例如3。 2.目录:我们的文件系统中仅设置一个目录,该目录包含文件系统中的所有文件。除了不需要显示地创建和删除之外,目录在很多方面和普通文件相像。目录对应0 号文件描述符。初始状态下,目录中没有文件,所有,目录对应的描述符中记录的长度应为0,而且也没有分配磁盘块。每创建一个文件,目录文件的长度便增加一分。目录文件的内容由一系列的目录项组成,其中每个目录项由如下内容组成: ?文件名 ?文件描述符序号 3.对文件的操作: 文件系统需提供如下函数;create, destroy, open, read, write。 ?create(filename): 根据指定的文件名创建新文件。 ?destroy(filename): 删除指定文件。 ?open(filename): 打开文件。该函数返回的索引号可用于后续的read, write, lseek, 或close 操作。 ?close(index): 关闭制定文件。 ?read(index, mem_area, count): 从指定文件顺序读入count 个字节mem_area 指定的内存位

操作系统实验---文件系统

实验报告 实验题目:文件系统 姓名: 学号: 课程名称:操作系统 所在学院:信息科学与工程学院 专业班级:计算机 任课教师:

实验项目名称文件系统 一、实验目的与要求: 1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及其内部实现。 2、熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。 3、通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。 4、通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。 二、实验设备及软件: 一台PC(Linux系统) 三、实验方法(原理、流程图) 试验方法 (1)首先应当确定文件系统的数据结构:主目录、子目录以及活动文件等。主目录和子 目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建文件,可以编号存储于磁盘上。如file0,file1,file2…并以编号作为物理地 址,在目录中登记。 文件系统功能流程图 图1.文件系统总体命令分析

图 2.登录流程图图 3. ialloc流程图 图4.balloc流程图图5.密码修改流程图

图6.初始化磁盘 图 7.显示所有子目录 dir/ls 操作流程图

图8.创建文件 creatfile 、创建目录 mkdir 流程图 图9.改变当前路径 cd 操作流程图

实验原理 1.文件操作 ◆mkdir 创建目录文件模块,输入 mkdir 命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的目录文件。在该创建过程中首先要判断该目录中有没有同名的文件,如果有的话就创建失败,还要判断在该目录下有没有创建文件的权限,有权限才可以创建。具体流程图查看第二节,系统流程图设计部分。 ◆del 删除文件模块,输入 del命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。具体流程图查看第二节,系统流程图设计部分。 ◆ls 显示当前目录下所有目录的模块,输入 ls 命令,回车 ,即会在屏幕上显示当前目录下的所有目录。在该过程中要判断该目录中是否为空,如果为空就没有必要执行该操作了。执行操作时,要调用 readdir (INode inode )函数 ,先读入文件内容到 content 里面,然后直接输出。如果子目录里面还有子目录,则通过递归,一并输出来。具体流程图查看第二节,系统流程图设计部分。 ◆chmod 改变文件权限模块,输入 chmod 命令,回车,输入文件名,回车,即会根据不同类别的用户在屏幕上提示要改变哪一类用户的权限。如果是文件拥有者执行该操作,他可以选择修改自己、其他用户的权限;如果是文件所属组成员执行该操作,他可以选择修改自己、其他用户的权限;如果是其他用户执行该操作,他只能选择修改自己的权限;在该过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了。执行操作时,要判断对该文件有没有执行写操作的权利,没有就不能进行。具体流程图查看第二节,系统流程图设计部分。 ◆cd 改变当前所在目录的模块。输入 cd,回车,相应的字符串,回车,则会根据输入字符串的不同跳转到不同的目录下。如果字符串是‘ .’ ,则到当前目录;如果字符串是‘ ..’ ,则到父目录;如果字符串是‘/’ ,则到根目录;如果字符串是当前目录下的子目录,则到该子目录;如果字符串是一个决定路径,则到该绝对路径。当然在执行的时候要判断有没有该子目录或者该绝对路径,如果没有的话,就不能执行。具体流程图查看第二节,系统流程图设计部分。 2. 用户操作 ◆login 用户注销模块,输入 login ,回车,当前用户就退出了,需要重新登录。 ◆pw 用户修改口令模块,输入 pw ,回车,则会提示输入原始密码,输入正确了才可以提示输入新密码,并且要求新密码输入两次,两次一样了才能通过修改密码成功。具体流程图查看第二节,系统流程图设计部分。 ◆logout 用户退出系统模块,输入 logout ,回车,系统自动退出。

实验5添加一个文件系统

实验5 添加一个文件系统 实验目的 文件系统是操作系统中最直观的部分,因为用户可以通过文件直接地和操作系统交互,操作系统也必须为用户提供数据计算、数据存储的功能。本实验通过添加一个文件系统,进一步理解Linux中的文件系统原理及其实现。 深入理解操作系统文件系统原理 学习理解Linux的VFS文件系统管理技术 学习理解Linux的ext2文件系统实现技术 设计和实现自定义文件系统 实验内容 添加一个类似于ext2的自定义文件系统myext2。实验主要内容: 添加一个和ext2完全相同的文件系统myext2 修改myext2的magic number 修改文件系统操作 添加文件系统创建工具 实验指导 1. 问题描述

本实验的内容是要添加一个类似于ext2的自定义文件系统myext2。myext2文件系统的描述如下: 1、myext2文件系统的物理格式定义与ext2基本一致,除了myext2的magic number 是0x6666,而ext2的magic number是0xEF53。 2、myext2是ext2的定制版本,它只支持原来ext2文件系统的部分操作,以及修改了部分操作。 2. 实验步骤 提示:下面的操作步骤以3.6.6版本的内核为例,2.6.15版本的内核请参照教材,其它版本内核可能会有所区别。 2.1 添加一个和ext2完全相同的文件系统myext2 要添加一个与ext2完全相同的文件系统myext2,首先是确定实现ext2文件系统的内核源码是由哪些文件组成。Linux源代码结构很清楚地告诉我们:fs/ext2目录下的所有文件是属于ext2文件系统的。再检查一下这些文件所包含的头文件,可以初步总结出来Linux 源代码中属于ext2文件系统的有: fs/ext2/acl.c fs/ext2/acl.h fs/ext2/balloc.c fs/ext2/bitmap.c fs/ext2/dir.c

文件系统存储空间管理模拟实验报告

课程名称计算机操作系统实验名称文件系统存储空间管理模拟姓名学号 专业班级实验日期 成绩指导老师 一、实验目的 根据提出的文件分配和释放请求,动态显示磁盘空闲空间的 态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。 二、实验原理 用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示、空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。 三、主要仪器设备 PC机(含有VC) 四、实验容与步骤 实验容:1. 模拟文件空间分配、释放过程,可选择连续分配、链式分配、索引分配法;2. 文件空闲空间管理,可采用空白块链、空白目录、位示图法; 步骤如下: 1. 输入磁盘基本信息参数,计算位示图大小,并随机初始化位示图; (1)磁盘基本信息:磁盘柱面数m, 每柱面磁道数p, 每磁道物理块数q; (2)假设采用整数数组存放位示图,则数组大小为: Size= ceil((柱面数*每柱面磁道数*每磁道物理块数)/(sizeof(int)*8))(3)申请大小为size的整数数组map,并对其进行随机初始化。 例如:假设m=2, p=4, q=8, 共有64个磁盘块,若sizeof(int)=2, 则位示图大小为4,map[4]如下: 地址到高地址位上。即map[0]的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map[1]的第0位到第15位对应16号磁盘块到31号磁盘块的状

操作系统实验-文件系统设计

文件系统设计 1.目的和要求 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 实验要求: ①在系统中用一个文件来模拟一个磁盘; ②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。 ③实现这个文件系统。 ④能实际演示这个文件系统。基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。 2.实验内容 1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录(AFD)。 3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 4)因系统小,文件目录的检索使用了简单的线性搜索。 5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。 6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录。 3.实验环境 VC 6.0 4.实验提示 1) format 格式化

只写打开模拟文件,初始化超级快,初始化dinode 位图 block 位图,初始化主目录,初始化etc 目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化 用户passwd 文件,写入模拟硬盘文件。 2 )install 安装 读写打开模拟文件,读取dinode 位图 block 位图,读取主目录,读取etc 目录,读取管理员admin 目录,读取用户xiao 目录,读取 用户passwd 文件。 3 )login 登陆 用户输入用户名和密码,在passwd 文件中查找是否有此用户,核对密码。正确则登陆成功,当前目录设定到当前用户文件夹下。 Login 登录 结束是,登录成功 输入用户名 查找是否有改 用户名 输入密码是 否 密码是否正确 否 4 )ialloc 申请inode 空间 先检测inode 位图是否加锁,是则退出。加锁,检测inode 空间是否还有已满,是则退出。在inode 位图中顺序查找空闲的inode ,找到则返回inode 地址,block 解锁。函数结束。

操作系统--实验六-文件系统设计试验

操作系统--实验六-文件系统设计试验

实验目的与要求: 通过设计一个基于索引结构的文件系统,加深对文件系统的基本知识理解。了解文件系统设计的基本概念。 (1)熟悉文件系统的物理结构; (2)熟悉文件系统的目录管理; (3)掌握文件系统空闲空间管理的基本方法; (4)进一步理解现代操作系统文件管理知识。 实验设备(环境): (1)一台安装有Cygwin Terminal的计算机 (2) Windows XP操作系统 (3)VC++6.0 实验内容: (1)熟悉文件系统的物理结构; (2)熟悉文件系统的目录管理; (3)掌握文件系统空闲空间管理的基本方法; (4)进一步理解现代操作系统文件管理知识。 实验步骤、实验结果及分析: (1) 设计一个文件系统的索引结构,描述逻辑结构与物理索引结构之间的关系; (2) 设计文件目录,描述文件名与文件物理结构之中的映射关系; (3) 定义作业; (4) 设计文件建立; (5)设计文件系统的其它功能;

实验结论: 试验运行结果: 图1程序运行结果 4、思考 该试验中,从功能能上讲,根据所学的文件系统管理方面知识,你所设计的(模拟)文件还有那些没有实现: 对以后设计的修改建议: 目前所做的修改及实际结果如下: 程序清单: #include "stdio.h" #include "stdlib.h" //文件索引表的定义 struct index{ int lr[32]; int pr[32];

char st[32]; }*wq; #define JOBN 20 //文件目录的定义 struct list{ char names[32]; int size[32]; struct index*p[32];//文件的索引表地址}*HEAD; //作业序列 struct que{ char name; int size; }job[JOBN]; int i,j,ly,li; char bb;

简单文件系统的实现实验报告

操作系统课程设计报告简单文件系统的实现 专业: 班级: 姓名: 学号: 老师:

一、课程设计的目的 1. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。 二、课程设计要求 1. 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。2文件存储空间的分配可采用显式链接分配或其他的办法。 3空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。 文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。 要求提供以下有关的操作命令: my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。 my_mkdir:用于创建子目录。 my_rmdir:用于删除子目录。 my_ls:用于显示目录中的内容。 my_cd:用于更改当前目录。 my_create:用于创建文件。 my_open:用于打开文件。 my_close:用于关闭文件。 my_write:用于写文件。 my_read:用于读文件。 my_rm:用于删除文件。 my_exitsys:用于退出文件系统。 三、程序的设计细想和框图 1.打开文件函数fopen() (1)格式:FILE *fopen(const char *filename,const char *mode) (2)功能:按照指定打开方式打开指定文件。 (3)输入参数说明: filename:待打开的文件名,如果不存在就创建该文件。 mode:文件打开方式,常用的有: "r":为读而打开文本文件(不存在则出错)。 "w":为写而打开文本文件(若不存在则创建该文件;反之,则从文件起始位置写,原内容将被覆盖)。 "a":为在文件末尾添加数据而打开文本文件。(若不存在则创建该文件;反之,在原文件末尾追加)。 "r+":为读和写而打开文本文件。(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变) 。 "w+":首先建立一个新文件,进行写操作,随后可以从头开始读。(若文件存在,原内容将全部消失) 。 "a+":功能与"a"相同;只是在文件末尾添加新的数据后,可以从头开始读。 另外,上述模式字符串中都可以加一个“b”字符,如rb、wb、ab、rb+、wb+、ab+等组合,

计算机操作系统体系结构实验报告

操作系统实验报告 实验目的: 随着操作系统应用领域的扩大,以及操作系统硬件平台的多样化,操作系统的体系结构和开发方式都在不断更新,目前通用机上常见操作系统的体系结构有如下几种:模块组合结构、层次结构、虚拟机结构和微内核结构。为了更好的了解计算机操作系统体系结构,以及linux 的体系结构,特作此报告。 实验内容: 计算机操作系统体系结构 一、模块组合结构 操作系统刚开始发展时是以建立一个简单的小系统为目标来实现的,但是为了满足其他需求又陆续加入一些新的功能,其结构渐渐变得复杂而无法掌握。以前我们使用的MS-DOS 就是这种结构最典型的例子。这种操作系统是一个有多种功能的系统程序,也可以看成是一个大的可执行体,即整个操作系统是一些过程的集合。系统中的每一个过程模块根据它们要完成的功能进行划分,然后按照一定的结构方式组合起来,协同完成整个系统的功能。如图1所示: 在模块组合结构中,没有一致的系统调用界面,模块之间通过对外提供的接口传递信息,模块内部实现隐藏的程序单元,使其对其它过程模块来说是透明的。但是,随着功能的增加,模块组合结构变得越来越复杂而难以控制,模块间不加控制地相互调用和转移,以及信息传递方式的随意性,使系统存在一定隐患。 二、层次结构 为了弥补模块组合结构中模块间调用存在的固有不足之处,就必须减少模块间毫无规则的相互调用、相互依赖的关系,尤其要清除模块间的循环调用。从这一点出发,层次结构的设计采用了高层建筑结构的理念,将操作系统或软件系统中的全部构成模块进行分类:将基础的模块放在基层(或称底层、一层),在此基础上,再将某些模块放在二层,二层的模块在基础模块提供的环境中工作;它只能调用基层的模块为其工作,反之不行。严格的层次结构,第N+l层只能在N层模块提供的基础上建立,只能在N层提供的环境中工作,也只能向N 层的模块发调用请求。 在采用层次结构的操作系统中,各个模块都有相对固定的位置、相对固定的层次。处在同一层次的各模块,其相对位置的概念可以不非常明确。处于不同层次的各模块,一般而言,不可以互相交换位置,只存在单向调用和单向依赖。Unix/Linux系统采用的就是这种体系结构。 在层次结构中,强调的是系统中各组成部分所处的位置,但是想要让系统正常运作,不得不协调两种关系,即依赖关系和调用关系。 依赖关系是指处于上层(或外层)的软件成分依赖下层软件的存在、依赖下层软件的运行而运行。例如,浏览器这部分软件就依赖GUI的存在和运行,GUI又依赖操作系统的存在和运行。在操作系统内部,外围部分依赖内核的存在而存在,依赖内核的运行而运行,内核又依赖HAL而运行。处在同层之内的软件成分可以是相对独立的,相互之间一般不存在相互依赖关系。 三、虚拟机结构 虚拟机的基本思想是系统能提供两个功能:①多道程序处理能力;②提供一个比裸机有更方便扩展界面的计算机。操作系统是覆盖在硬件裸机上的一层软件,它通过系统调用向位于

模拟文件系统实验报告

操作系统大型试验 实 验 报 告 姓名:XX 班级:软件工程110x 学号:201126630xxx

一、名称 操作系统大型试验。 二、目的 用C++编写出一个简单的模拟文件系统,实现目录的添加、删除、重命名,文件的添加、删除、重命名、文件和目录、文件的拷贝。 三、要求 开发工具:word,vc win32api 1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存储 2.文件系统的目录结构采用类似Linux的树状结构; 3.要求模拟的操作包括: a)目录的添加、删除、重命名; b)目录的显示(列表) c)文件的添加、删除、重命名 d)文件和目录的拷贝 4.用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档;输入某个命令+?时显示该条命令的使用说明 5.用户输入exit时退出该系统 6.实验实现基于windows平台; 7.实验开发语言可以选用C/c++等 四、设计 1.主要思路说明 本模拟系统通过一个大小固定的数组要代表物理盘块,假设共有1024块,新增目录占一块,新增文件占一块,文件中可输入内容,内容假设定义为5个字符占一块,超出则应新申请空间。模拟物理盘块的数组中,数组内容为-99代表改物理盘块内容为空,可使用,其他数字均代表该物理盘块被占用,其中-3代表是占用文件的末结点,其他整数代表是文件内容的下一个寻址下标,另有一个string类型的数组来存储内容,模拟文件写入了对应下标的物理盘块中。设置了一个全局指针指向根结点,一个全局指针指向当前操作目录。搜索空白物理盘块时采用顺序搜索物理盘块数组。存储形式主要采用类似二叉树结构,如目录为根,目录下的第一个文件或目录存在根的子节点,目录下的其他文件或目录存在第一个文件或目录的兄弟节点,以此类推。 本程序仅seperate()函数使用现成代码,此函数功能为将输入命令串分离,仅仅起到美观作用,其余所有代码均为原创! 2.申优功能: 1)能实现动态增长,即当输入文件的内容大小大于分配的模拟物理盘块时系统能够自动寻找空物理盘块并分配,将超出的内容保存在新的物理盘块中,若超出模拟磁盘大小,则超出部分不保存且返回提示。 2)能实现级联删除,即当删除目录(文件夹)时,目录下的所有内容也应当删除并正确释放物理盘块空间。 3)能实现目录的复制,即复制目录时(文件夹)时,该目录下的所有文件和目录也应准确复制至目标目录中,并正确分配物理盘块空间。

操作系统文件系统实验

实验四文件系统实验 一.实验题目: 文件系统实验 二.实验目的: 阅读并调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 了解设计一个n个用户的文件系统,每个用户可以保存M个文件。用户在一次运行中只能打开一个文 件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令. 三.实验设备及环境: 1. 硬件设备:PC机一台 2. 软件环境:安装Windows操作系统,C语言软件。 四.实验内容及要求: 在阅读所给文件系统源程序的基础上,画出其实现的详细流程图,并给出有关的数据结构和说明。 五. 实验方法内容 1.算法流程图

(2)void Execute(int i,int len,int cmdset)执行命令函数流程图 (3)创建文件

(4)写文件流程图 (5)修改文件执行权限 (6

2.主要的常量变量 char cmd[64]; //存放用户输入命令 char buffer[36]; char user[32];//存放当前登陆的用户名 typedef char ALFA[12]; ALFA KWORD[keynum]; struct UFD{//用户文件管理模块 char filename[32]; //文件名 int safecode; //文件保护码 long length; //文件长度 }*curfile = NULL; struct MFD{//用户登陆信息管理模块 char username[32]; //用户名 bool filepoint; //用户目录下的文件指针,false表示目录为空,true为该用户目录中有文件 }*curuser = NULL,*elseuser=NULL; typedef UFD UFD; typedef MFD MFD; 3.主要模块 void KeyWord()//初始化命令关键字 int LoginDisplay() //登陆选项操作函数 bool Login(int SELETE)//用户登陆,注册函数 void DisplayUFD()//打印用户信息,包括用户的各个文件 //名称、长度和操作权限的设置信息 void ByeFile(bool BOOL)//注销函数,调用次函数用户可以退出系统 bool ClearUserFile()//用户要将自己的注册目录从系统彻底删除 //首先将该用户目录下的全部文件删除 void ClearUserMes()//删除用户全部信息 void CreatFile()//在当前用户目录下创建文件 void DeleteFile() //删除当前目录下一个文件的操作 void ListAllFile()//显示当前用户目录下的文件信息 bool QueryModElse(bool BOOL,bool &flag)//查询其它用户目录下文件的文件 //当该文件的权限允许当前用户对其执行有关操作时,返回ture bool QueryMod(bool BOOL)//查询权限 bool WriteRight(int len,bool BOOL)//查看是否已经正确地写入到该文件信息中 void WriteLengthToFile(int Len,bool BOOL)//将文件长度写入文件管理模块中 void WriteFile()//向文件写入信息的操作 void ReadFile()//读文件函数 void ChangeMod()//修改某文件的执行权限 void Execute(int i,int len,int cmdset)//执行命令函数 void Command()//读取用户输入的命令,并将其转换成系统能识别的命令 void main() 4.代码 /***************************************************************** * 文件名: Simple_file_system.c * 功能: 简单文件管理系统模拟程序 *******************************************************************/ #include #include #include #include #include "conio.h" #include #define NULL 0 #define keynum 10 #define getspace(type) (type*)malloc(sizeof(type)) char cmd[64]; //存放用户输入命令 char buffer[36];//

相关主题
文本预览
相关文档 最新文档