为linux系统设计一个简单的二级文件系统。要求做到以下几点:

作者&投稿:唐唐 (若有异议请与网页底部的电邮联系)
操作系统课程设计——为LINUX 设计一个简单的二级文件...~

你可以再网络上查询:制作小型的linux系统

悬赏分:10?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MEM_D_SIZE 1024*1024 //总磁盘空间为1M
#define DISKSIZE 1024 //磁盘块的大小1K
#define DISK_NUM 1024 //磁盘块数目1K
#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小
#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号
#define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小
#define DIR_MAXSIZE 1024 //路径最大长度为1KB
#define MSD 5 //最大子目录数5
#define MOFN 5 //最大文件深度为5
#define MAX_WRITE 1024*128 //最大写入文字长度128KB

struct fatitem /* size 8*/
{
int item; /*存放文件下一个磁盘的指针*/
char em_disk; /*磁盘块是否空闲标志位 0 空闲*/
};

struct direct
{
/*-----文件控制快信息-----*/
struct FCB
{
char name[9]; /*文件/目录名 8位*/
char property; /*属性 1位目录 0位普通文件*/
int size; /*文件/目录字节数、盘块数)*/
int firstdisk; /*文件/目录 起始盘块号*/
int next; /*子目录起始盘块号*/
int sign; /*1是根目录 0不是根目录*/

}directitem[MSD+2];

};

struct opentable
{
struct openttableitem
{
char name[9]; /*文件名*/
int firstdisk; /*起始盘块号*/
int size; /*文件的大小*/
}openitem[MOFN];
int cur_size; /*当前打文件的数目*/
};

struct fatitem *fat; /*FAT表*/
struct direct *root; /*根目录*/
struct direct *cur_dir; /*当前目录*/
struct opentable u_opentable; /*文件打开表*/
int fd=-1; /*文件打开表的序号*/
char *bufferdir; /*记录当前路径的名称*/
char *fdisk; /*虚拟磁盘起始地址*/

void initfile();
void format();
void enter();
void halt();
int create(char *name);
int open(char *name);
int close(char *name);
int write(int fd,char *buf,int len);
int read(int fd,char *buf);
int del(char *name);
int mkdir(char *name);
int rmdir(char *name);
void dir();
int cd(char *name);
void print();
void show();

void initfile()
{
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M空间*/
format();

}

void format()
{
int i;
FILE *fp;

fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址,引导区向后偏移 1k)*/
/*-----初始化FAT表------------*/
fat[0].item=-1; /*引导块*/
fat[0].em_disk='1';

for(i=1;i<ROOT_DISK_NO-1;i++) /*存放 FAT表的磁盘块号*/
{
fat[i].item=i+1;
fat[i].em_disk='1';
}

fat[ROOT_DISK_NO].item=-1; /*存放根目录的磁盘块号*/
fat[ROOT_DISK_NO].em_disk='1';

for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)
{
fat[i].item = -1;
fat[i].em_disk = '0';
}
/*-----------------------------------------------*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/
/*初始化目录*/
/*---------指向当前目录的目录项---------*/
root->directitem[0].sign = 1;
root->directitem[0].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[0].name,".");
root->directitem[0].next = root->directitem[0].firstdisk;
root->directitem[0].property = '1';
root->directitem[0].size = ROOT_DISK_SIZE;
/*-------指向上一级目录的目录项---------*/
root->directitem[1].sign = 1;
root->directitem[1].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[1].name,"..");
root->directitem[1].next = root->directitem[0].firstdisk;
root->directitem[1].property = '1';
root->directitem[1].size = ROOT_DISK_SIZE;
if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
for(i=2;i<MSD+2;i++) /*-子目录初始化为空-*/
{
root->directitem[i].sign = 0;
root->directitem[i].firstdisk = -1;
strcpy(root->directitem[i].name,"");
root->directitem[i].next = -1;
root->directitem[i].property = '0';
root->directitem[i].size = 0;
}

if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虚拟磁盘空间保存到磁盘文件中*/
{
printf("Error:\n File write error! \n");
}

fclose(fp);

}
void enter()
{
FILE *fp;
int i;

fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M空间*/
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fread(fdisk,MEM_D_SIZE,1,fp)) /*把磁盘文件disk.dat 读入虚拟磁盘空间(内存)*/
{
printf("Error:\nCannot read file\n");
exit(0);
}
fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/
fclose(fp);
/*--------------初始化用户打开表------------------*/
for(i=0;i<MOFN;i++)
{
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
}
u_opentable.cur_size = 0;

cur_dir = root; /*当前目录为根目录*/
bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char));
strcpy(bufferdir,"Root:");
}

void halt()
{
FILE *fp;
int i;

if((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /*把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat */
{
printf("Error:\nFile write error!\n");
}
fclose(fp);

free(fdisk);
free(bufferdir);
return;
}

int create(char *name)
{

int i,j;

if(strlen(name)>8) /*文件名大于 8位*/
return(-1);

for(j=2;j<MSD+2;j++) /*检查创建文件是否与已存在的文件重名*/
{
if(!strcmp(cur_dir->directitem[j].name,name))
break;
}
if(j<MSD+2) /*文件已经存在*/
return(-4);

for(i=2;i<MSD+2;i++) /*找到第一个空闲子目录*/
{
if(cur_dir->directitem[i].firstdisk==-1)
break;
}
if(i>=MSD+2) /*无空目录项*/
return(-2);
if(u_opentable.cur_size>=MOFN) /*打开文件太多*/
return(-3);

for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空闲盘块 j 后退出*/
{
if(fat[j].em_disk=='0')
break;
}
if(j>=DISK_NUM)
return(-5);
fat[j].em_disk = '1'; /*将空闲块置为已经分配*/
/*-----------填写目录项-----------------*/
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk = j;
cur_dir->directitem[i].size = 0;
cur_dir->directitem[i].next = j;
cur_dir->directitem[i].property = '0';
/*---------------------------------*/
fd = open(name);
return 0;

}

int open(char *name)
{
int i, j;

for(i=2;i<MSD+2;i++) /*文件是否存在*/
{
if(!strcmp(cur_dir->directitem[i].name,name))
break;
}
if(i>=MSD+2)
return(-1);
/*--------是文件还是目录-----------------------*/
if(cur_dir->directitem[i].property=='1')
return(-4);

/*--------文件是否打开-----------------------*/
for(j=0;j<MOFN;j++)
{
if(!strcmp(u_opentable.openitem[j].name,name))
break;
}
if(j<MOFN) /*文件已经打开*/
return(-2);

if(u_opentable.cur_size>=MOFN) /*文件打开太多*/
return(-3);

/*--------查找一个空闲用户打开表项-----------------------*/
for(j=0;j<MOFN;j++)
{
if(u_opentable.openitem[j].firstdisk==-1)
break;
}
/*--------------填写表项的相关信息------------------------*/
u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk;
strcpy(u_opentable.openitem[j].name,name);
u_opentable.openitem[j].size = cur_dir->directitem[i].size;
u_opentable.cur_size++;
/*----------返回用户打开表表项的序号--------------------------*/
return(j);
}

int close(char *name)
{
int i;

for(i=0;i<MOFN;i++)
{
if(!strcmp(u_opentable.openitem[i].name,name))
break;
}
if(i>=MOFN)
return(-1);
/*-----------清空该文件的用户打开表项的内容---------------------*/
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
u_opentable.cur_size--;

return 0;
}

int write(int fd, char *buf, int len)
{
char *first;
int item, i, j, k;
int ilen1, ilen2, modlen, temp;
/*----------用 $ 字符作为空格 # 字符作为换行符-----------------------*/
char Space = 32;
char Endter= '\n';

for(i=0;i<len;i++)
{
if(buf[i] == '$')
buf[i] = Space;
else if(buf[i] == '#')
buf[i] = Endter;
}

/*----------读取用户打开表对应表项第一个盘块号-----------------------*/

item = u_opentable.openitem[fd].firstdisk;

/*-------------找到当前目录所对应表项的序号-------------------------*/
for(i=2;i<MSD+2;i++)
{
if(cur_dir->directitem[i].firstdisk==item)
break;
}
temp = i; /*-存放当前目录项的下标-*/
/*------找到的item 是该文件的最后一块磁盘块-------------------*/
while(fat[item].item!=-1)
{
item =fat[item].item; /*-查找该文件的下一盘块--*/
}

/*-----计算出该文件的最末地址-------*/
first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;

/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/
if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len)
{
strcpy(first,buf);
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
else
{
for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)
{/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/
first[i] = buf [i];
}
/*-----计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-------*/
ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2 = ilen1/DISKSIZE;
modlen = ilen1%DISKSIZE;
if(modlen>0)
ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/

for(j=0;j<ilen2;j++)
{
for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*寻找空闲磁盘块*/
{
if(fat[i].em_disk=='0')
break;
}
if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/
return(-1);
first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/
if(j==ilen2-1) /*--如果是最后要分配的一块-*/
{
for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)
first[k] = buf[k];
}
else/*-如果不是要最后分配的一块--*/
{
for(k=0;k<DISKSIZE;k++)
first[k] =buf[k];
}

fat[item].item = i; /*--找到一块后将它的序号存放在上一块的指针中-*/
fat[i].em_disk = '1'; /*--置找到的磁盘快的空闲标志位为已分配-*/
fat[i].item = -1; /*--它的指针为 -1 (即没有下一块)-*/
}
/*--修改长度-*/
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
return 0;
}

int read(int fd, char *buf)
{
int len = u_opentable.openitem[fd].size;
char *first;
int i, j, item;
int ilen1, modlen;

item = u_opentable.openitem[fd].firstdisk;

ilen1 = len/DISKSIZE;
modlen = len%DISKSIZE;
if(modlen!=0)
ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/

first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/

for(i=0;i<ilen1;i++)
{
if(i==ilen1-1) /*--如果在最后一个磁盘块-*/
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j] = first[j];
}
else /*--不在最后一块磁盘块-*/
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j] = first[j];
item = fat[item].item; /*-查找下一盘块-*/
first = fdisk+item*DISKSIZE;
}
}
return 0;
}

int del(char *name)
{
int i,cur_item,item,temp;

for(i=2;i<MSD+2;i++) /*--查找要删除文件是否在当前目录中-*/
{
if(!strcmp(cur_dir->directitem[i].name,name))
break;
}


Linux有哪些特点
②Linux Shell:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接受用户输入的命令,并对其进行解释,最后送入内核去执行,实际上就是一个命令解释器。人们也可以使用Shell编程语言编写Shell程序,这些Shell程序与用其他程序设计语言编写的应用程序具有相同的效果。③Linux 文件系统:文件...

linux是个什么操作系统
⑤模块化程序:Linux内核设计非常精巧,分成进程调度、内存管理、进程间通信、虚拟文件系统和网络接口五大部分;其独特的模块机制可根据用户的需求,实时地将某些模块插入或从内核中移走,使得Linux系统内核可以裁剪得非常小巧。⑥广泛的硬件支持:Linux能支持X86、ARM、MIPS、ALPHA和PowerPC等多种体系结构和微...

linux是什么意思
其实我见过很多人,有很多不同的读法,其实不用过度纠结读音问题。Linux 的由来 要说Linux必须先说说Unix, Linux诞生之前,先有的Unix,因为Unix并非免费开源的,用必须买授权之类的,很少人承担的起。在1983年,理查德·斯托曼创建了一个自由软件,类Unix,与POSIX兼容的操作系统为目标的GNU计划。作为这个...

[基于Linux,Qt的列车人机界面的设计]人机界面设计
[2]俞辉、李永,ARM嵌入式Linux系统设计与开发[M].机械工业出版社,2001.[3]怯肇乾,嵌入式图形系统设计[J].北京航空航天大学出版社,2005.[4]刘凯,Qt程序设计[M]. 清华大学出版社,2003.作者简介:万坤(1989-),男,江西南昌人,硕士研究生在读,主要从事嵌入式系统和列车通信网络的研究。

谁知道Linux的简介
Linux系统简介 什么是Linux 简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。Linux最早由一位名叫Linus Torvalds的计算机爱好者开发,他的目的是设计一个代替Minix的...

Linux的文件系统
4、FAT32:FAT32(File Allocation Table 32)是一个与Windows兼容的文件系统,通常用于USB闪存驱动器和其他可移动媒体。5、NTFS:NTFS(New Technology File System)是Windows NT及其后续版本使用的文件系统。Linux可以通过特定的驱动程序来读写NTFS格式的分区。6、ReiserFS:ReiserFS是一个专为Linux设计的文件...

Lunix操作系统与WINDS操作系统有什么区别它有什么优点?
2、WINDS操作系统:采用了图形化模式GUI,比起从前的Dos需要输入指令使用的方式,更为人性化。三、优势不同 1、Lunix操作系统:能运行主要的Unix工具软件、应用程序和网络协议。支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。2、WINDS操作系统:由开发...

LINUX系统是什么?
通俗来讲,就是一款操作系统。跟你用的windows、苹果mac OS系统、手机安卓系统一样。区别在于,Linux系统是开源的,免费的,主要运用在服务器端。也就是公司的服务器上。上面一般是用来跑服务的,比如web服务、DNS服务、游戏服务。这些服务程序可以为用户提供服务,比如你玩的游戏,大多数的服务端都是运行...

linux操作系统都有哪几种_linux操作系统的特点有哪些
2、Centos 其实就是redhat换了个商标而已,相对于redhat基本上没有区别,好处就是完全免费,坏处是不提供任何技术支持。中小企业的一些标准服务器系统经常采用。3、ubuntu 个人系统方面的做的相当优秀,尤其是丰富的资源库和领先的图形界面的设计。不过作为服务器端目前用的还是不太多。各大互联网公司应用...

linux操作系统有什么技术特色
一、 Linux的诞生 Linux的兴起可以说是Internet创造的一个奇迹。 1991年初,当年轻的芬兰大学生Linus Torvalds在开始其Linux 操作系统的设计时,他的目的只不过是想看一看Intel 386存储 管理硬件是怎样工作的,而绝对没有想到这一举动会在计算机界 产生如此重大的影响。他的设计进展得很顺利,只花了几个月时 间就在一...

任丘市13211956816: 为linux系统设计一个简单的二级文件系统.要求做到以下几点: -
裴岩代宁: #include<stdio.h> #include<string.h> #include<stdlib.h> #define MEM_D_SIZE 1024*1024 //总磁盘空间为1M#define DISKSIZE 1024 //磁盘块的大小1K#define DISK_NUM 1024 //磁盘块数目1K#define FATSIZE DISK_NUM*sizeof(struct fatitem) ...

任丘市13211956816: 为Linux系统设计一个简单的二级文件系统
裴岩代宁: 不会啊

任丘市13211956816: 操作系统linux 二级文件系统具体是怎么实现的 -
裴岩代宁: 说通俗一点就类似于数组加上链表的结构,i_addr[8]数组中每一个元素都指向了一个磁盘块,如果那个磁盘块中也存放了一个i_addr[8]数组,并且那个数组中的每个元素也指向了一个磁盘块,那么这就是二级的索引文件结构了~ 建议看一下操作系统原理(庞丽萍)一书中的文件系统一章 这个东西是Unix V的一种典型的文件系统~呵呵~

任丘市13211956816: 在linux系统中,如何编写以下程序?请各位大侠帮忙,谢谢! -
裴岩代宁: /*没检查过,不知道有笔误没,有的话你指出来*/#include<linux/module.h>#include<linux/init.h>#include<linux/fs.h>#include<linux/kernel.h>#include<linux/malloc.h>#include<asm/uaccess.h>#include<linux/errno.h>/**全局变量*/ unsigned int fs_...

任丘市13211956816: 急求!!!操作系统实验:编写一个简单的Linux任务管理器 -
裴岩代宁: 你这相当于叫人写个shell... 具体实现思路应该有两种 A.用system函数调dos命令来实现,这其实是取巧了.B.完全自己真正写个命令解释程序.这可以分成三步来实现 第一步 要自己设计一个内部命令表,按你的要求,采用模块化的方法,这个表...

任丘市13211956816: 想在Linux系统中设计一个非常简单的图形界面.求指引!求指引! -
裴岩代宁: linux下开发,一般有两种语言:Qt和GTK+;前者较为流行,可跨平台,因:KDE出名;后者集成到gnome的语言开发中;都很强大,而GTK+主要应用C语言,相对来说,比较简单;QT主要应用C++类来实现的,更具有一般性,比如:windows下的VC++概念是相同的.这里有一个 GTK+的例程,可以看下,希望对你有帮助:http://www.yyearth.com/article/13-01/29.html

任丘市13211956816: 怎么做一个精简的linux呢?
裴岩代宁: 前几年就有手表型的计算机卖,里面装的就是嵌入式Linux,嵌入式操作系统是一种相当袖珍的系统.嵌入式Linux的制作比精简Windows要容易.因为Linux本身实际上只是一个有进程管理功能的内核,然后用各种各样的程序把这个内核“武装起来”.对Linux的精简要从内核开始,去掉不用的功能和驱动(Linux内置基本驱动,其他不必须的驱动采用模块的方式挂载),只保留必须的部分.然后就是修改系统结构,使一些基本的必备的系统功能尽量少占空间(很多用不到的外设也免了).最后就是合理的选择应用软件,这个比较费心,因为自由软件的发展趋势是越来越“胖”...好在喜欢汇编和C的人还是很多的...

任丘市13211956816: linux文件系统程序 -
裴岩代宁: 直接mkdir就行 标准C++绝对可以 必要的时候加上system的命令

任丘市13211956816: 服务器linux 桌面linux -
裴岩代宁: 1、初学者学习linux的话最重要的是有linux环境,在自己的机子上用VMware是最方便的.但是在自己的机子上使用VMware的话,推荐使用手动分区,因为本身机子的资源就不多.使用推荐的分区会创建卷标,显得比较乱,按照默认的分区格式安装的分区不太理想.2、两种方式都可以将linux系统安装成功,如果学习的话,可以两种方式都试一下,新系统多操作比较好.如果要以后的学习中作服务器之类的服务的话,建议使用手动分区,这样便于资源管理.3、区别的话有两个方面:1、按照系统安装成功与否的话,两种方式没有区别;2、从服务器管理角度来说,推荐分区不易于管理.

任丘市13211956816: 在Linux系统中怎样创建超级用户,之前有创建了个普通用户 -
裴岩代宁: 1. 首先使用useradd命令创建一个普通用户 useradd user12. 修改/etc/passwd文件中的user1用户这一行,把其中的第三列uid改为0,第四列gid改为03. 输入id user1 可以看到该用户的uid已被改为0(root),gid已被改为0(root)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网