操作系统课程设计-成组链接模拟unix文件系统
[问题描述]
在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的 模拟UNIX文件系统 。
[基本要求]
1.在现有机器硬盘上开辟20M的硬盘空间,作为设定的硬盘空间。
2.编写一管理程序对此空间进行管理,以模拟UNIX(linux)文件系统,具体要求如下:
(1) 要求盘块大小1k
(2) i 结点文件类型 正规文件目录文件(共1byte)块设备 管道文件
。物理地址(索引表)
共有13个表项,每表项2byte
。文件长度 4byte
。联结计数 1byte
(3)0号块 超级块 栈长度50
空闲盘块的管理:成组链接 ( UNIX)
位示图法 (Linux)
(4)每建一个目录,分配4个物理块
文件名 14byte
(5)目录项信息
i 结点号 2byte
(6)结构: 0#: 超级块
1#-20#号为 i 结点区
20#-30#号为根目录区
(7)功能: 1、初始化
2、建立文件(需给出文件名,文件长度)
3、建立子目录
4、打开文件(显示文件所占的盘块)
5、删除文件
6、删除目录
7、显示目录(即显示目录下的信息,包括文件、子目录等)
8、显示整个系统信息
2、模拟文件系统
[问题描述]
在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的小型文件系统。
[基本要求]
该小型文件系统没有子目录机制,文件连续分配,不考虑分区。
做一个简单的 操作界面,提供四条简单的命令:简单的ls、cat、cp、rd.
进一步增强:
上题中的文件系统功能:文件系统不连续分配,可以有子目录 机制,(如两级子目录机制)。
附录 课程设计报告内容
一.实验题目与要求。
二.总的设计思想及环境说明、工具等。
三.本题所需数据结构与模块说明。
四.运行结果与运行情况。
五.自我评析与总结。
1. 你认为你完成的哪些比较好或比较出色;
2. 差距与局限,什么做的不太好或什么地方可以做的更好以待改进;
3. 从本作业得到的收获:对编写与调试过程中经验教训的总结;
4. 完成本题的其他方法或你的设想;
5. 对本实验题的评价和改进意见。
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#include <string.h>
int physic[100]; //文件地址缓冲区
int style=1; //文件的类型
char cur_dir[10]="root"; //当前目录
struct command
{
char com[10];
}cmd[12];
struct block
{
int n; //空闲的盘快的个数
int free[50]; //存放空闲盘快的地址
int a; //模拟盘快是否被占用
}memory[20449];
struct block_super
{
int n; //空闲的盘快的个数
int free[50]; //存放进入栈中的空闲块
int stack[50]; //存放下一组空闲盘快的地址
}super_block;
struct node //i结点信息
{
int file_style; //i结点 文件类型
int file_length; //i结点 文件长度
int file_address[100]; //i结点 文件的物理地址
} i_node[640];
struct dir //目录项信息
{
char file_name[10]; //文件名
int i_num; //文件的结点号
char dir_name[10]; //文件所在的目录
} root[640];
void format() //格式化
{
int i,j,k;
super_block.n=50;
for(i=0;i<50;i++) //超级块初始化
{
super_block.free[i]=i; //存放进入栈中的空闲块
super_block.stack[i]=50+i; //存放下一组的盘块
}
for(i=0;i<640;i++) //i结点信息初始化
{
for(j=0;j<100;j++)
{
i_node[i].file_address[j]=-1;//文件地址
}
i_node[i].file_length=-1; //文件长度
i_node[i].file_style=-1; //文件类型
}
for(i=0;i<640;i++) //根目录区信息初始化
{
strcpy(root[i].file_name,"");
root[i].i_num=-1;
strcpy(root[i].dir_name,"");
}
for(i=0;i<20449;i++) //存储空间初始化
{
memory[i].n=0; //必须有这个
memory[i].a=0;
for(j=0;j<50;j++)
{
memory[i].free[j]=-1;
}
}
for(i=0;i<20449;i++) //将空闲块的信息用成组链接的方法写进每组的最后一个块中
{ //存储空间初始化
if((i+1)%50==0)
{
k=i+1;
for(j=0;j<50;j++)
{
if(k<20450)
{
memory[i].free[j]=k;//下一组空闲地址
memory[i].n++; //下一组空闲个数 注意在memory[i].n++之前要给其赋初值
k++;
}
else
{
memory[i].free[j]=-1;
}
}
memory[i].a=0; //标记为没有使用
continue; //处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环
}
for(j=0;j<50;j++)
{
memory[i].free[j]=-1;
}
memory[i].n=0;
}
printf("已经初始化完毕\n");
printf("进入UNIX文件模拟............\n\n");}