基于Linux的模拟文件系统的设计与实现

基于Linux的模拟文件系统的设计与实现
基于Linux的模拟文件系统的设计与实现

中北大学

操作系统课程设计

说明书

学院、系:软件学院

专业:软件工程

学生姓名:任彬学号:0921010132 设计题目:基于Linux的模拟文件系统的设计与实现

起迄日期: 2011年12月22日- 2012年1月7日指导教师:康珺

2012 年 1月 7 日

1.需求分析

本次课程设计题目为“基于Linux的模拟文件系统的设计与实现”,要求在linux开源环境下,通过使用系统库函数以及操作命令,模拟实现典型文件系统,实现文件的各项基本操作,以此加深对所学文件操作的了解以及操作方法的特点。通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深教材中的重要算法的理解,同时通过编程实现这些算法,更好地掌握操作系统的远离及实现方法,提高综合运用各专业课知识的能力。根据实验要求可将系统功能简述如下:

(1)设计一个10个用户的文件系统。每个用户最多可以保存10个文件,一次运行用户可打开多个文件。

(2)程序采用二级文件目录。(即设置主目录(MFD)和用户文件目录(UFD))。另外,可打开文件设置指针。

(3)为了方便实现,对文件的读写作了简化。在执行读写命令时,只需改读写指针。并不进行实际的读写操作。

(4)实现目录的相关操作:改变目录(CD),创建目录(MD),显示目录(DIR),删除目录(RD)。

(5)实现文件的相关操作:打开文件(open),关闭文件(close),创建一个新文件(create),删除一个文件(delete),写文件(write),读文件(read)。

(6)考虑特殊情况如:目录不存在时,给出错误信息;不能用cd进入文件;命令之中不能有空格(如ex it,给出错误提示);新建目录或文件时的问题、重名问题、目录或文件的名字长度限制、目录或文件的名字中包含不合法字符(注意空格)、删除目录或文件时的问题、删除不存在的文件或目录给出错误提示、删除目录时目录不为空(如果该目录为空,则可删除,否则给出是否做删除提示,删除操作将该目录下的全部文件和子目录都删除)、进入到某个目录下,却要删除本目录或上级目录、不能用delete删除目录、不能用RD删除文件等。.

2.总体设计

本系统以C语言为编程基础,通过调用linux环境下的库函数实现各功能模块。

<1>整个系统采用“主函数-子函数”结构。系统初始化无误后,运行主函数,在主函数中通过输入参数的变化调用相关功能子函数。各子函数之间采用平行结构,只与主函数有联系,整个系统共由17个子模块实现。

系统流程图如下:

各模块按功能可分为三类:

(1)文件初始化。void initfile()(初始化文件系统); void format()(格式化); void enter()(进入文件系统)。

(2)目录管理。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) (删除文件)。

(3)文件管理。int mkdir(char *name) (创建子目录); int rmdir(char *name) (删除子目录); void dir()(显示当前目录的子目录); int cd(char *name) (更改当前目录); void print()(显示当前路径); void show()(输出提示信息)。<2>为实现文件的模拟访问以及控制,利用disk.dat虚拟磁盘的管理调度,保存运行过程中各项操作以及数据。各个子函数在功能实现时,首先必须利用相应指针定位到disk.dat文件,操作完成后将运行参数保存到文件中。

<2>结构体设计

(1)二级目录实现。为实现二级目录,定义如下结构体变量file,content。

typedef struct file{

char name[10];

struct file *next;

}File;

file结构体用于保存文件名,并通过指向下一个文件的指针形成单向链表。

typedef struct content{

char name[10];

File *file;

int f_num;

struct content *next;

}Content;

Content结构体用于保存目录名,此外,一方面通过指向下一个目录的指针形成单向链表,另一方面通过指向下一级的文件指针实现连接该目录头文件的作用,以此实现二级目录索引。

(2)用户访问实现。为实现用户访问,定义如下结构体user。

typedef struct user{

char name[10];

char psw[10];

Content *con;

struct user *next;

user结构体用于保存用户名和密码,通过指向下一个用户的指针将注册用户形成单向链表。用户登录时,进行用户名、密码的判断,若正确,跳转到主界面,否则通过指针的链接到下一个用户信息,重复上述过程。

(3)虚拟磁盘管理的实现。为实现虚拟磁盘的管理调度,定义结构体fatitem,direct,opentable。

struct fatitem /* size 8*/

{

int item; /*存放文件下一个磁盘的指针*/

char em_disk; /*磁盘块是否空闲标志位0 空闲*/

};

Fatitem结构体用于文件配置表fat表的结构定义。

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];

-};

direct结构体用于目录项结构的定义,其中嵌套的FCB用于文件控制块的定义。

struct opentable

{

struct openttableitem

{

char name[9]; /*文件名*/

int firstdisk; /*起始盘块号*/

int size; /*文件的大小*/

}openitem[MOFN];

int cur_size; /*当前打文件的数目*/

};

Opentable结构体用于文件打开表项结构的定义。

3.详细设计

结构化程序设计的模式是自顶向下,逐步求精的过程。当设计一个程序时,需要将需要将求解问题逐步分解成能解决局部问题的更小的功能模块,直到每一个局部模块都不能再分为止,每一个最小化的模块对应一个相应的函数。函数的功能应该最小化,即每个函数只完成一个简单的功能。根据模块功能能最小化的思想,我们将程序划分为17个子模块,每个模块只负责完成一个功能,他们分别为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()(输出提示信息)以及main函数。各个函数通过相互嵌套调用,最终完成实现linux下模拟文件的设计和实现。

(1)初始化文件系统:initfile()函数

主要源码为:

void initfile()

{

fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char));

format();

}

使用库函数Malloc 向系统申请分配指定size个字节的内存空间。,用来储存char类型文件,同时初始化文件。

(2)格式化文件:void 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

{

fat[i].item=i+1;

fat[i].em_disk='1';

}

//fat[ROOT_DISK_NO-1].item=-1;

//fat[ROOT_DISK_NO-1].em_disk='1';

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

fat[ROOT_DISK_NO].em_disk='1';

for(i=ROOT_DISK_NO+1;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

{

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);

}

本函数用来计算在程序中已定义的struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目录*/;struct direct *cur_dir; /*当前目录*/的地址及对他们进行初始化,方便以后的使用。通过指针定义的方法,将结构体中的成员进行定义。

(3)void enter()(进入文件系统);

主要源码为:

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

{

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_LENGTH*sizeof(char));

strcpy(bufferdir,"Root:");

}

本函数完成进入文件系统的功能,首先定义一个文件指针并分配空间,然后进行if语句判断,以只读的方式打开二进制文件,如果无法打开,显示错误,打开成功,则检测把是否磁盘文件disk.dat 读入虚拟磁盘空间(内存),失败同样显示错误,当两项条件句满足要求时,找到fat表地址,找到根目录地址,打开文件并显示目录。

(4) void halt()(退出文件系统);

主要源码为:

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;

}

本函数完成关闭文件的功能,与进入文件系统相同,首先定义一个文件指针并分配空间,然后进行if语句判断,是否建立了只允许写的文件disk.dat,如果文件不存在,显示错误,文件存在成功,则检测把是否把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat,失败同样显示错误,当两项条件句满足要求时,关闭文件,释放的缓存空间。

(5)int create(char *name) (创建文件)

主要源码为:

int create(char *name)

{

int i,j;

if(strlen(name)>8) /*文件名大于8位*/

return(-1);

for(j=2;j

{

if(!strcmp(cur_dir->directitem[j].name,name))

break;

}

if(j

return(-4);

for(i=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

{

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;

}

本函数实现创建文件的功能,首先进行条件判断,检测文件名长度,检测文件是否有重名,其中文件名不能超过八位,文件不能有重名。如果两项条件满足,则采用顺序法查找符合条件的空闲子目录,创建文件,用指针定义法将结构体定义,创建文件;如果没有空闲目录项或打开文件过多则返回一个错误的值。

(6)int open(char *name) (打开文件)

主要源码为:

int open(char *name)

{

int i, j;

for(i=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

{

if(!strcmp(u_opentable.openitem[j].name,name))

break;

}

if(j

return(-2);

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

return(-3);

/*--------查找一个空闲用户打开表项-----------------------*/

for(j=0;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);

}

本函数用来实现打开文件的功能,首先检测输入的文件名是否存在,不存在,则不做任何运行,存在则继续下一步逻辑判断。接着检测输入的是文件名还是目录,是目录,返回一个错误的值,是文件名,则监测文件是否打开,打开则不作操作,未打开则寻找一个空闲用户,打开文件,返回打开文件的序号。

(7) int close(char *name) (关闭文件)

主要源码为:

int close(char *name)

{

int i;

for(i=0;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;

}

本函数实现关闭文件的功能,同时清空该文件的用户打开表项的内容。

(8)int write(int fd,char *buf,int len) (读文件);

主要源码为:

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

{

if(buf[i] == '$')

buf[i] = Space;

else if(buf[i] == '#')

buf[i] = Endter;

}

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

item = u_opentable.openitem[fd].firstdisk;

/*-------------找到当前目录所对应表项的序号-------------------------*/

for(i=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

{

for(i=ROOT_DISK_NO+1;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

}

else/*-如果不是要最后分配的一块--*/

{

for(k=0;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;

}

本函数用来实现写文件的功能。文件打开后,进行写操作,更改文件内容。首先检测写入的内容,检测是否存在$与#的字符,若有,则将$ 字符作为空格# 字符作为换行符。然后读取用户打开表对应表项第一个盘块号,找到当前目录所对应表项的序号,找到该文件的最后一块磁盘块,计算出文件的最末地址,计算写入文件大小,如果最后磁盘块剩余的大小大于要写入的文件的大小,则写入文件,如果最后磁盘块剩余的大小小于要写入的文件的大小,将磁盘写满后,计算出还剩下多少字节未存储,还需多少磁盘,在链表中寻找空闲磁盘块,继续写入剩余字节,找到后,记录此磁盘的首地址指针,写入文件,磁盘写满后将后一个磁盘的起始地址的指针放入到前一磁盘的指针中,完成文件的链接,就这样直到文件写完为止,最后修改文件长度。

(9) int read(int fd,char *buf) (读文件);

主要源码为:

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

{

if(i==ilen1-1) /*--如果在最后一个磁盘块-*/

{

for(j=0;j

buf[i*DISKSIZE+j] = first[j];

}

else /*--不在最后一块磁盘块-*/

{

for(j=0;j

buf[i*DISKSIZE+j] = first[j];

item = fat[item].item; /*-查找下一盘块-*/

first = fdisk+item*DISKSIZE;

}

}

return 0;

}

本函数完成简单的磁盘读的功能,首先计算文件所占磁盘的块数,找到文件的起始位置,然后根据指针依次访问磁盘,完成整个文件的读功能。

(10) int del(char *name) (删除文件);

主要源码为:

int del(char *name)

{

int i,cur_item,item,temp;

for(i=2;i

{

if(!strcmp(cur_dir->directitem[i].name,name))

break;

}

cur_item = i; /*--用来保存目录项的序号,供释放目录中-*/

if(i>=MSD+2) /*--如果不在当前目录中-*/

return(-1);

if(cur_dir->directitem[cur_item].property!='0') /*--如果删除的(不)是目录-*/

return(-3);

for(i=0;i

{

if(!strcmp(u_opentable.openitem[i].name,name))

return(-2);

}

item = cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/

while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/

{

temp = fat[item].item;

fat[item].item = -1;

fat[item].em_disk = '0';

item = temp;

}

/*-----------------释放目录项-----------------------*/

cur_dir->directitem[cur_item].sign = 0;

cur_dir->directitem[cur_item].firstdisk = -1;

strcpy(u_opentable.openitem[cur_item].name,"");

cur_dir->directitem[cur_item].next = -1;

cur_dir->directitem[cur_item].property = '0';

cur_dir->directitem[cur_item].size = 0;

return 0;

}

本函数用来删除文件,首先检测要删除文件是否在当前目录中,无则返回错误信息,有则将文件的序号提供,查找文件地址,监测文件是否打开,如果打开,则提示文件已打开,无法删除,没打开则释放文件内存空间,释放目录项,同时修改Fat表。

(11) int mkdir(char *name) (创建子目录);

主要源码为:

int mkdir(char *name)

{

int i,j;

struct direct *cur_mkdir;

if(!strcmp(name,"."))

return(-4);

if(!strcmp(name,".."))

return(-4);

if(strlen(name)>8) /*-如果目录名长度大于8位-*/

return(-1);

for(i=2;i

{

if(cur_dir->directitem[i].firstdisk==-1)

break;

}

if(i>=MSD+2) /*-目录/文件已满-*/

return(-2);

for(j=2;j

{

if(!strcmp(cur_dir->directitem[j].name,name))

break;

}

if(j

return(-3);

for(j=ROOT_DISK_NO+1;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=ROOT_DISK_SIZE;

cur_dir->directitem[i].next=j;

cur_dir->directitem[i].property='1';

/*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/

cur_mkdir=(struct direct *)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE);

/*-初始化目录-*/

/*-指向当前目录的目录项-*/

cur_mkdir->directitem[0].sign=0;

cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].firstdisk;

strcpy(cur_mkdir->directitem[0].name,".");

cur_mkdir->directitem[0].next=cur_mkdir->directitem[0].firstdisk;

cur_mkdir->directitem[0].property='1';

cur_mkdir->directitem[0].size=ROOT_DISK_SIZE;

/*-指向上一级目录的目录项-*/

cur_mkdir->directitem[1].sign=cur_dir->directitem[0].sign;

cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[0].firstdisk;

strcpy(cur_mkdir->directitem[1].name,"..");

cur_mkdir->directitem[1].next=cur_mkdir->directitem[1].firstdisk;

cur_mkdir->directitem[1].property='1';

cur_mkdir->directitem[1].size=ROOT_DISK_SIZE;

for(i=2;i

{

cur_mkdir->directitem[i].sign=0;

cur_mkdir->directitem[i].firstdisk=-1;

strcpy(cur_mkdir->directitem[i].name,"");

cur_mkdir->directitem[i].next=-1;

cur_mkdir->directitem[i].property='0';

cur_mkdir->directitem[i].size=0;

}

return 0;

}

本函数用来实现创建子目录的功能,同文件的创建一样,目录名不得大于8位,且不得有重名。不满足则返回不同的值,如果条件满足,目录创建继续进行。寻找空闲目录,寻找空闲磁盘块,将空闲设置为已分配,创建子目录并初始化,同时计算所创目录在虚拟磁盘上的地址(内存物理地址),指向当前目录的目录项,指向上一级目录的目录项。至此,子目录创建完成。

(12)int rmdir(char *name) (删除子目录);

主要源码为:

int rmdir(char *name)

{

int i,j,item;

struct direct *temp_dir;

/*-检查当前目录项中有无该目录-*/

for(i=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(-3);

/*-判断要删除的目录有无子目录-*/

temp_dir=(struct direct *)(fdisk+cur_dir->directitem[i].next*DISKSIZE);

for(j=2;j

{

if(temp_dir->directitem[j].next!=-1)

break;

}

if(j

return(-2);

/*------------找到起始盘块号,并将其释放----------------*/

item=cur_dir->directitem[i].firstdisk;

fat[item].em_disk='0';

/*-修改目录项-*/

cur_dir->directitem[i].sign=0;

cur_dir->directitem[i].firstdisk=-1;

strcpy(cur_dir->directitem[i].name,"");

cur_dir->directitem[i].next=-1;

cur_dir->directitem[i].property='0';

cur_dir->directitem[i].size=0;

return 0;

}

本函数用来删除子目录,首先检测要删除目录是否在当前目录中,无则返回错误信息,有则将目录的序号提供,删除目录,同时修改父目录项。

(13)void dir()(显示当前目录的子目录);

主要源码为:

void dir()

{

int i;

for(i=2;i

{

if(cur_dir->directitem[i].firstdisk!=-1) /*-如果存在子目录-*/

{

printf("%s\t",cur_dir->directitem[i].name);

if(cur_dir->directitem[i].property=='0') /*-文件-*/

printf("%d\t\t\n",cur_dir->directitem[i].size);

else

printf("\t<目录>\t\n");

}

}

}

通过顺序法显示当前目录子目录。

(14) int cd(char *name) (更改当前目录);

主要源码为:

int cd(char *name)

{

int i,j,item;

char *str;

char *temp,*point,*point1;

struct direct *temp_dir;

temp_dir=cur_dir;

str=name;

if(!strcmp("\\",name))

{

cur_dir = root;

strcpy(bufferdir,"Root:");

return 0;

(完整版)操作系统毕业课程设计说明书-基于Linux的模拟文件系统的设计与实现

中北大学 操作系统课程设计 说明书 学院、系:软件学院 专业:软件工程 学生姓名:徐春花学号: 设计题目:基于Linux的模拟文件系统的设计与实现 起迄日 期: 2014年6月14日- 2014年6月26日指导教薛海丽

师: 2014 年 6月 26 日 前言 简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。 Linux不仅为用户提供了强大的操作系统功能,而且还提供了丰富的应用软件。用户不但可以从Internet上下载Linux及其源代码,而且还可以从Internet上下载许多Linux的应用程序。可以说,Linux本身包含的应用程序以及移植到Linux上的应用程序包罗万象,任何一位用户都能从有关Linux的网站上找到适合自己特殊需要的应用程序及其源代码,这样,用户就可以根据自己的需要下载源代码,以便修改和扩充操作系统或应用程序的功能。这对Windows NT、Windows98、MS-DOS或OS2

等商品化操作系统来说是无法做到的。 Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。其中有对读、 写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。在相关软 件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器 使用,利用IPCHAINSIPTABLE网络治理工具可构建NAT及功能全面的防火墙。 Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系 统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑 器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形 用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系 统进行操作。 目录 1需求分析 (3) 1.1 功能介绍 (3) 1.2 目的及意义 (5) 1.2.1 目的 (5) 1.2.2 意义 (6) 1.3 设计成果 (7) 2总体设计 (8) 2.1功能介绍 (8) 2.2模块关联 (9) 3详细设计 (12)

LINUX文件系统制作详细

Linux文件系统制作流程 关键词:ARM Linux yaffs文件系统移植 Linux文件系统简介 Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。 Linux下的文件系统结构如下: Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。 不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,

SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。 >基于FLASH的文件系统 Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。 闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash 的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。 在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD 驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。 顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。 1.jffs2 JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux,uCLinux中。 Jffs2:日志闪存文件系统版本2(Journalling Flash FileSystem v2) 主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。 目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。 jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在

模拟电子课程设计课设传感器测量系统

模拟电子技术课程设计任务书 姓名:院(系):信息系 专业:班级: 课程设计题目:传感器测量系统的设计 课程设计要求:设计一个放大器系统,当电阻值变化±1%时,放大电路能够产生±6V的输出电压。要求偏差为0时输出为0,偏差为1%时输出为6V,偏差为-1%时输出为-1V,误差不超过±2%。 设计任务总述:对设计题目进行分析,根据设计的要求先确定基准电压源:为测量电桥提供一定精度要求的7.0V基准电压,然后修改电路,进行参数计算.,测量当电阻值变化±1%时,放大电路能够产生±6V的输出电压;要求偏差为0时输出为0,偏差为1%时输出为6V,偏差为-1%时输出为-6V,误差不超过±2%;最后电路仿真实验。 工作计划及安排: 熟悉课题要求,查找相关资料;甄选资料的相关内容,初步确定设计方案;寻找参考电路,修改电路,进行参数计算.调试(仿真),如不成功,返回第2步整理数据; 撰写课程设计报告。 成绩 指导教师签字___________________ 年月日

摘要: 设计一个放大器系统,当电阻值变化±2%时,放大电路能 够产生±8V 的输出电压。要求偏差为0时输出为0,偏差为2%时输出为8V ,偏差为-2%时输出为-8V ,误差不超过±5%。 一、电路结构及原理说明: 该电路由四部分组成:基准电压源电路、测量电桥电路、放大电路、电平转移电路。 电路框图如下所示: 1.基准电压源:为测量电桥提供一定精度要求的7.5V 基准电压,采用5.6V 稳压管与同相比例运算电路结合实现。 2.测量电桥电路:当电桥的所有阻值都相同时,输出电压为零。当有一电阻发生变化时将会有电压输出。此电路可以等效为传感器测量电路,测取的温度变化量并将其转化成电压变化。 3.放大电路: 放大电路用于将测温桥输出的微小电压变化(ΔV )放大,使其满足性能要求。放大电路采用两个同相电压跟随器(作为输入缓冲器)与两级放大器组成,其中第一级放大器为差动放大器,第二级放大器为可以方便调节的反相比例运算电路。 4.电平转移电路: 二、测量电路和参数计算 基准电压源 测量电桥 放大电路 电平转移电路

文件管理系统课程设计

课程名称:操作系统 实验题目:文件管理系统 1、课程设计选题 (3) 1.1主要设计内容 3 1.2主要设计思路 3 2、课程设计需求分析 3 3、概要设计 (4) 3.1整体设计框架 4 3.2各模块的基本功能 4 4、系统实现 5 4.1原理 6 4.2各模块算法思想 6 4.3流程图描述 9 4.4代码描述 10 5、系统测试 11

5.1系统主界面 11 5.2子系统功能测试 11 6、总结 19 7、参考文献样式 19 1、课程设计选题 1.1主要设计内容 本课程设计主要是用C语言编写,设计的是一个模拟的多用户多级目录的文 件管理系统。通过具体的文件存储空间的管理、文件的物理结构、目录结构和文 件操作的实现,加深对文件系统内部功能和实现过程的理解。 1.2主要设计思路 首先系统要完成初始化的任务,建立起整个系统,等待用户注册,注册成功后,用户登录模块,对用户的用户名进行验证,如果用户登录成功,则系统进入 等待用户输入的状态,用户选择相应指令后,系统按照即定方式处理用户请求, 用户退出后,系统转入登录模块,等待下一位用户的登录。 2、课程设计需求分析 本系统为多用户多级目录的文件管理系统,用户可以根据所注册的用户名登 陆来对文件或是文件进行操作。多用户功能可以满足不同用户不同的需求,同时 也起到了很好的保密作用。 文件系统为用户提供了按名存取的功能,以使得用户能透明地存储访问文

件。为了实现按名存取,文件需要对文件存储设备进行合理的组织,分配;对存储在文件存储设备上的文件进行保护,保密和提供共享的手段。另外,文件系统还要提供检索文件或文件中记录的手段,文件系统就是完成上述功能的一组软件和数据结构的集合。 模拟一个文件管理系统,要完成对文件的基本操作,文件的基本操作有文件、文件夹的打开、新建、删除和读取写入文件,创建更改目录,列出目录内容等信息。系统建立了文件目录树,存储文件系统中的所有文件。对于用户名下的文件,用文件目录树的分枝来存贮。 采用命令行操作界面很直观,也方便用户进行操作,用户只要按照操作界面所显示的命令来操作就行了。 因为存在着同一个目录下不能有同名文件的问题。所以在进行文件的基本操作时要考虑到在已经有的文件中是否有同名文件,有的话则输出提示信息。 3、概要设计 3.1整体设计框架 系统初始化界面是由用户注册,用户登录,退出系统三个模块组成。用户登录模块再由创建用户,进入目录,删除用户,显示所有用户,显示位示图,修改用户资料几大模块组成。然后各个模块再由一些小模块组成。其中创建文件,打开关闭文件,读写文件等文件操作模块包括在进入目录模块里面。 3.2各模块的基本功能 3.21系统初始化 系统的初始化包括初始化了磁盘的空间即位示图、一个管理员用户 3.22用户注册模块 用户可以在这里注册,用户名和密码的最大长度都为10个字节,如果用户名不重复的话,则注册成功,用户的权限默认为一般用户。

Linux文件系统剖析

2007 年12 月03 日 在文件系统方面,Linux? 可以算得上操作系统中的“瑞士军刀”。Linux 支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统。对于使用标准的和比较奇特的文件系统以及开发文件系统来说,Linux 是极好的平台。本文讨论Linux 内核中的虚拟文件系统(VFS,有时候称为虚拟文件系统交换器),然后介绍将文件系统连接在一起的主要结构。 基本的文件系统体系结构 Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子。通过使用一组通用的API 函数,Linux 可以在许多种存储设备上支持许多种文件系统。例如,read 函数调用可以从指定的文件描述符读取一定数量的字节。read 函数不了解文件系统的类型,比如ext3 或NFS。它也不了解文件系统所在的存储媒体,比如AT Attachment Packet Interface(ATAPI)磁盘、Serial-Attached SCSI(SAS)磁盘或Serial Advanced Technology Attachment(SATA)磁盘。但是,当通过调用read 函数读取一个文件时,数据会正常返回。本文讲解这个机制的实现方法并介绍Linux 文件系统层的主要结构。 什么是文件系统? 首先回答最常见的问题,“什么是文件系统”。文件系统是对一个存储设备上的数据和元数据进行组织的机制。由于定义如此宽泛,支持它的代码会很有意思。正如前面提到的,有许多种文件系统和媒体。由于存在这么多类型,可以预料到Linux 文件系统接口实现为分层的体系结构,从而将用户接口层、文件系统实现和操作存储设备的驱动程序分隔开。

操作系统课程设计

课程设计报告 2015~2016学年第一学期 操作系统综合实践课程设计 实习类别课程设计 学生姓名李旋 专业软件工程 学号130521105 指导教师崔广才、祝勇 学院计算机科学技术学院 二〇一六年一月

- 1 -

- 2 -

一、概述 一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX 的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX中的文件系统磁盘存储区分配图如下: 本次课程设计是要实现一个简单的模拟Linux文件系统。我们在内存中开辟一个虚拟磁盘空间(20MB)作为文件存储器,并将该虚拟文件系统保存到磁盘上(以一个文件的形式),以便下次可以再将它恢复到内存的虚拟磁盘空间中。文件存储空间的管理可采用位示图方法。 二、设计的基本概念和原理 2.1 设计任务 多用户、多级目录结构文件系统的设计与实现。可以实现下列几条命令login 用户登录 logout 退出当前用户 dir 列文件目录 creat 创建文件 delete 删除文件 open 打开文件 close 关闭文件 - 3 -

read 读文件 write 写文件 mkdir 创建目录 ch 改变文件目录 rd 删除目录树 format 格式化文件系统 Exit 退出文件系统 2.2设计要求 1) 多用户:usr1,usr2,usr3,……,usr8 (1-8个用户) 2) 多级目录:可有多级子目录; 3) 具有login (用户登录)4) 系统初始化(建文件卷、提供登录模块) 5) 文件的创建:create (用命令行来实现)6) 文件的打开:open 7) 文件的读:read8) 文件的写:write 9) 文件关闭:close10) 删除文件:delete 11) 创建目录(建立子目录):mkdir12) 改变当前目录:cd 13) 列出文件目录:dir14) 退出:logout 新增加的功能: 15) 删除目录树:rd 16) 格式化文件系统:format 2.3算法的总体思想 - 4 -

操作系统课程设计-模拟文件系统

目录 第1章需求分析 (1) 第2章概要设计 (1) 系统的主要功能 (1) 系统模块功能结构 (1) 运行环境要求 (2) 数据结构设计 (2) 第3章详细设计 (3) 模块设计 (3) 算法流程图 (3) 第4章系统源代码 (4) 第5章系统测试及调试 (4) 运行结果及分析 (4) 系统测试结论 (5) 第6章总结与体会 (6) 第7章参考文献 (6) 附录 (7)

第1章需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。 模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 第2章概要设计 系统的主要功能 1) 系统运行时根据输入的用户数目创建主目录 2) 能够实现下列命令: Login 用户登录 Create 建立文件 Read 读取文件 Write 写入文件 Delete 删除文件 Mkdir 建立目录 Cd 切换目录 Logout 退出登录 系统模块功能结构

运行环境要求 操作系统windows xp ,开发工具vc++ 数据结构设计 用户结构:账号与密码结构 typedef struct users { char name[8]; char pwd[10]; }users; 本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。 users usrarray[8] = { "usr1","usr1", "usr2","usr2", "usr3","usr3", "usr4","usr4",

文件管理系统设计方案和对策

文件管理系统设计方案 传统的管理和保存文件的方式是人工生成和保管文件(包括:生成、传阅、审批、进入受控状态等),文件通常是保存在文件柜中的。 由于文件数量多,版本复杂,在实际使用中经常出现问题,例如:文件版本不一致、文件查找困难、文件管理处理历史记录报表工作量过大等。本方案旨在解决单位对大量工程和技术文件的管理,达到并确保工作人员手中文件版本的一致性、文件更改的可追溯性,同时以实现电子公告、电子通知、电子邮件、公文收发等功能来提高单位日常办公及管理的自动化。 一、文件管理系统的建设目标和意义 目标: 满足企业对文件信息进行集中管理、查询的需要 通过文件的集中管理,使企业实现资料共享,资料同步更新 企业重要文档的使用权限设置,一方面节约了资本,另一方面自动化管理,保证了资料的保密性和安全性 简化了员工查找和使用资料的工作步骤,使员工把时间放在其他更有价值的工作上,减少重复劳动,提高工作效率,为企业争取更多 利润 把无纸化办公和自动化办公结合起来,实现了无纸化和物理化文档管理的有机组合 把先进的数据库技术运用于文档管理,促进企业信息化管理的进步文件管理系统建设意义: 1、分类、管理企业文件 文件管理系统通过数据库管理,对企业纷杂的文件内容进行分门别类的管理,按照不同的介质(图片、影音、word、excel、ppt、pdf等)进行存放管理。 文件管理系统通过权限管理,对不同的员工开放不同级别的文件库,最大程

度保证企业的文件安全。 2、共享、学习企业文件 文件管理系统通过内部网络将文件资本进行共享,让更多的人分享到企业文件资本,拓宽部门和员工的知识范围。 3、应用、增值文件资本 文件管理平台构建面向企业业务流程的文件管理系统,使得工作过程中显形知识结构化,隐形知识显形化。 通过文件的不断重复应用,实现文件增值。有效的规避了人员升迁流动所造成了关键业务领域的损失,让业务运行不辍。 4、提升企业竞争力 创造企业新竞争价值,增加企业利润,降低企业成本,提高企业效率。建立企业新文化,鼓励思想自由,培育创新精神。 通过减少反应时间来提高为客户服务的水平,通过快速向市场提供产品和服务来增加收入。 二、文件管理系统的建设要求 首先是支持的文件内容要全面,从文件管理的内容角度,至少应该包括: ?对信息的发布,比如直接发布各种内容 ?对文档的管理,如各类DOC、XLS、PPT等文件 ?对数据信息的管理,如各类报表等等 有利于充分利用文件: ?对链接的处理:在内容中可以互相链接,它是有效利用文件的非常重要的环节 ?强有力的索引能力,特别是全文检索 ?对于动态数据的强有力查询能力,比如可以根据各种条件进行查询

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

简单文件系统的设计及实现 一、实验目的: 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 一. 概述......................................................................................................... ......................... 3 1.绪论 ........................................................................................................ ........................ 3 2.背景 ........................................................................................................ ........................ 3 3.功能分析 ........................................................................................................ ................. 3 二. 业务流程 ........................................................................................................ .................... 4 1.人力资源数据流图如下: (4) 2.人力资源ER图如下: ..................................................................................................... 5 三. 信息采集与各部门的使用权限............................................................................................. 6 四. 系统模块描述 ........................................................................................................ ............. 6 1.岗位信

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分)得分: 评阅教师特殊评语: 评阅教师: 日期:

图书管理系统设计文档(DOC)

摘要 随着科学技术的进步和计算机行业的迅速发展,人们的工作效率得到大大提高。计算机信息处理系统的引进已彻底改变了许多系统的经营管理。 图书管理系统是学校管理机制中的重要组成部分,通过对图书馆管理系统的运行管理机制进行调查和研究,开发了此图书馆管理系统。本文中主要介绍了图书馆管理事务中的常见基本问题等研究背景,进行了全面的可行性分析,详细论证了系统的需求分析、系统设计、系统实现和系统测试过程。 本系统使用JSP进行网页界面的设计,使用MVC设计模式,通过JDBC驱动和数据库进行无缝连接。 系统实现了用户登录、图书管理、借书证管理、图书借阅管理等功能模块。用户登录模块实现用户的登录和权限判定;图书管理模块实现了对图书的添加、删除、修改、查询等功能;借书证管理模块实现了对学生的添加、删除、修改、查询等功能;图书借阅管理模块实现了学生对图书的借阅、还书和所借图书的查看等功能。 测试结果表明,本系统实现了图书馆图书管理的主要功能,基本满足图书管理的需要。

1 绪论 图书管理系统的主要功能是实现图书馆图书的借阅和归还的管理自动化,图书新增及销毁的及时化,用户及图书信息的更新,围绕这些主要功能,本系统涉及到以下核心功能:借阅管理,归还管理,图书管理,学生管理。除了这些核心功能外,还包括一些基本和辅助的功能,它们是:图书信息管理,查询功能等。 该系统设计的主要目标是: 设计一个图书馆管理系统,该系统主要功能分为图书查询、图书借阅归还和图书管理三大部分。在图书查询模块中要求用户能在浏览器中分别书名、著译者、类型等条件查询;在图书管理模块中要求能完成如办理借书证(即添加新的学生)、新书录入、借书还书登记、图书修改等日常管理功能。 (1)网站前台设计:前台供学生使用,学生登录后有如下权利 ①图书查询:用户可以按多种方式对图书库中的图书进行查询; ②借阅信息查询:用户可以查看自己的历史借阅信息。 (2)网站后台设计:后台是供管理员使用的,管理员登陆后有如下权利 ①办理借阅证:将学生信息填写完整,在数据库中注册新用户; ②书籍的录入及删除:可以对现有图书库中的图书进行删除,也可以添加新书; ③借书还书登记:普通用户借阅或归还图书时,管理员将在借阅信息表中添加相应的记录; ④图书修改:管理员可以对现有图书的详细信息进行修改。

linux文件系统的权限王国(一)

作者:池建强 在这个系列中和?大家聊聊 Linux 的?文件、?用户、?用户组、?文件系统的权限等内容,其中很多细节也是我使?用了很?长时间 Linux 后才真正掌握,希望?大家不?用那么久。 为什么是 Linux ?我觉得写技术的东?西还是相对严谨?一些好,虽然Unix 、Linux 、OS X ?一脉相承,但在具体命令上还是会有些差异,这个系列?文章?里所有的命令和显?示结果都是在 Linux 上进?行的,?大家可以对照在 Mac 上试试,当然最后也会讲?一点 OS X 的内容,否则怎么叫 MacTalk 呢? 在开始讲 Linux ?王国的?臣民之前,先介绍?一下?王国中最?牛的主:root ,这货不翻译为「根」,也不叫「管理员」,?而是被尊称为超级Linux ?文件系统的权限?王国(?一)

?用户,是不是觉得?高端霸?气?超级?二字绝不是恭维之词,从 Linux ?王国诞?生之初,root 就存在了,他会?一直霸占着超级?用户的?角?色并世世代代存在下去,没有禅让,没有民选,没有换位,所有的?用户都?自他?而起。如果你以为 root 会像上帝创造亚当和夏娃那样,让这?二位开开?心?心?生娃去了,那你就太Naive了。Linux 系统中的所有?用户要么由root 创建,要么借?用 root 的权限创建,等级极为森严,总之没有 root 的允许,想搞出?一位新?用户绝?无可能。看到这你们是不是都开始觉得计划?生育政策好啦? root 不仅能够管理?用户,还能管理?文件系统、进程、设备、??网络、通信、协议等等,总之他就像站在神?山上的神祗,俯视着芸芸众?生,看着数据信息在软件和硬件之间川流不息,时不时的做?一些计划性干预,如果有?人想超越系统的规则,他就能让你消失的像从来没有存在过。 所以那些成天叫嚣被蹂躏被代表的民众,看看 root,?大家?心理就会舒服?一些。 以 root 开篇,下?面我们聊聊 Linux 的?文件系统和索引节点。 Linux 的?文件系统本?身是?比较复杂的,仅 ext2、ext3 和 ext4 就得解释好?几天,本?文的重点不在于此,所以简单介绍?一下。?文件系统主要是?用来保存?文件和相关结构的,让?文件存储更安全、更快、更容易检索、能?支持更?大的物理介质等等。在 Linux 系统中,每个磁盘分区都可以看做?一个?文件系统,每个系统都有?自?己的??目录结构,Linux 会把这些分区按照?一定的?方式组织成统?一的??目录结构,?方便?用户访问。但是每个分区上的?文件系统都是独?立的,可以采?用不容的?文件格式,就像?一国两制?一样,虽然统?一,但是?自治。 那么如何查看?文件系统的格式呢?可以使?用 df -T -h 命令,T 表?示打印?文件格式,h 表?示?用G 或 M 来显?示?文件?大?小,如下:

操作系统课程设计-文件系统

模拟一个简单二级文件管理系统 设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 设计内容:模拟一个简单二级文件管理系统 一、实验内容描述 1 实验目标 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现. 2 实验要求 为DOS系统设计一个简单的二级文件系统.要求做到以下几点: ①可以实现下列命令: login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 ②列目录时要列出文件名、物理地址、保护码和文件长度. ③源文件可以进行读写保护. 二、程序主要内容 1设计思路 程序中要求每个用户在登陆后才可对其拥有的文件进行操作,用户对于其他用户的文件无操作权.文件操作包括浏览、创建、删除、打开、关闭、阅读、写入、修改模式.其他操作包括新建用户、帮助、用户登入、用户登出、退出系统. 在程序文件夹下有个名为“file”的系统根目录,此目录下包括:一个名为“mfd”的文件,记录所有注册过的帐号及密码;用户文件,以用户名作为文件名,内容为其拥有的文件名及属性;一个名为“keiji”的文件夹.“keiji”文件夹中包括:“file.p”指针文件,记录所有已用的物理地址;一些以物理地址为名的文件,内容为文件内容. 2 数据结构 file结构体系统文件数据结构: fpaddrint,文件的物理地址、flengthint,文件长度、fmodeint,文件模式0.只读;1.可写; 2.可读写; 3.保护、fname[]char,文件名; filemode结构体文件状态数据结构: isopenint,文件当前状态,0.关闭;1.打开、modeint,文件模式0.只读;1.可写;2.可读写;

详细分析Linux文件系统格式优劣

?摘要:Linux支持多种文件系统,包括ext2、iso9660、jffs、ext3、vfat、ntfs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System) ?标签:文件系统 ?Linux由于其开源安全特性正在被多数企业所接受。Linux支持很多种文件系统,ext3、vfat、ntfs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了另一个文件系统VFS(Virtual File System)。下面我们就分析一下他的各种文件系统格式的特点 基于RAM的文件系统 (1)Ramdisk Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。 在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。 (2)ramfs/tmpfs Ramfs是LinusTorvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS 本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。 Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。 Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。 Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。 3.网络文件系统NFS(NetworkFileSystem) NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS 的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。 附录:NOR闪存与NAND闪存比较

文件系统课程设计报告

操作系统课程设计报告 题目:文件系统 专业:软件工程 院系:信息管理学院 年级:大三软件Q1141 学号: 11150132 姓名:王毅 指导教师:李红艳 职称:副教授 湖北经济学院教务处制

目录 操作系统课程设计报告 一实验内容 (2) 二设计的基本概念和原理 (2) 三总体设计 (2) 2-1 文件的组织结 构............................................................. (2) 2-2 磁盘空间的管 理............................................................. (2) 2-3 目录结 构 (3) 2-4文件操 作 (4) 四详细设计 (4) 4-1 建立文件(create_file)流程 图 (4) 4-2 打开文件(open_file)流程 图 (6) 4-3读文件(read_file)流程 图 (7) 4-4 写文件(write_file)流程

图 (8) 4-5 关闭文件(close_file)流程 图 (9) 4-6 删除文件(delete_file)流程 图 (10) 4-7 显示文件内容(typefile)流程 图 (11) 4-8 建立目录(md)流程 图 (12) 4-9显示目录内容流程 图 (13) 五详细代码 (14) 六运行结果截图 (40) 七总结 (44) 八参考文献 (45) 一、实验内容 要求设计一个简单的文件系统,用文件模拟磁盘,实现以下功能: (1)支持多级目录结构; (2)实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件、关闭文件、改变文件属性。

模拟电子课程设计

长沙学院课程设计说明书 题目有源低通滤波器电路设计系(部)电子与通信工程系 专业(班级)XX一班 姓名XXX 学号XXXXXXXX 指导教师XXX 起止日期2011.12.19-2011.12.23

模拟电路课程设计任务书 一.设计题目 有源低通滤波器电路设计 二.技术参数和设计要求 1. 技术参数 设计一个能阻挡高频信号,输出低频信号的有源低通滤波电路; 2. 设计要求 (1)根据技术参数设计电原理图; (2)计算并选择电路元件及参数(含电源变压器); (3)仿真调试电路;举例说明所设计的有源高通滤波器的广泛应用,简要说明电路的工作原理。 (4)撰写设计说明书。 三.设计工作量 设计时间一周,2011年下学期进行。 四.工作计划 星期一:布置设计任务,查阅资料; 星期二~星期三:设计方案论证,进行电路设计,计算并选择电路元件及参数; 星期四:仿真调试电路 星期五:撰写设计报告书,进行个别答辩。 五.参考资料

1.彭介华,《电子技术课程设计指导》,北京:高等教育出版社,1997; 2.高吉祥,《电子技术基础实验与课程设计》,北京:电子工业出版社,2005; 3.童诗白,《模拟电子技术基础》,北京:高等教育出版社,1988; 4.康华光,《电子技术基础——模拟部分》,北京:高等教育出版社,2006 5.本课程教材 六.指导教师 XXXXXXXXXXXXXXXX 七.系部审批 长沙学院课程设计鉴定表

目录 引言 (5) ※一设计任务与要求 (5) 1.1 设计任务 (5) 1.2 设计要求 (6) ※二实验经过 (6) 2.1 实验原理 (6) 2.2 实验步骤 (7) 2.2.1滤波器的选择 (7) 2.2.2 一阶低通有源滤波

操作系统精髓与设计原理-第12章-文件管理

第12章文件管理 复习题: 12.1、域和记录有什么不同? 答:域(field)是基本数据单位。一个域包含一个值。记录(record)是一组相关的域的集合,它可以看做是应用程序的一个单元。 12.2、文件和数据库有什么不同? 答:文件(file)是一组相似记录的集合,它被用户和应用程序看做是一个实体,并可以通过名字访问。数据库(database)是一组相关的数据集合,它的本质 特征是数据元素间存在着明确的关系,并且可供不同的应用程序使用。 12.3、什么是文件管理系统? 答:文件管理系统是一组系统软件,为使用文件的用户和应用程序提供服务。12.4、选择文件组织时的重要原则是什么? 答:访问快速,易于修改,节约存储空间,维护简单,可靠性。 12.5、列出并简单定义五种文件组织。 答:堆是最简单的文件组织形式。数据按它们到达的顺序被采集,每个记录由一串数据组成。顺序文件是最常用的文件组织形式。在这类文件中,每个记录 都使用一种固定的格式。所有记录都具有相同的长度,并且由相同数目、长度 固定的域按特定的顺序组成。由于每个域的长度和位置已知,因此只需要保存 各个域的值,每个域的域名和长度是该文件结构的属性。索引顺序文件保留 了顺序文件的关键特征:记录按照关键域的顺序组织起来。但它还增加了两个 特征:用于支持随机访问的文件索引和溢出文件。索引提供了快速接近目标记 录的查找能力。溢出文件类似于顺序文件中使用的日志文件,但是溢出文件中 的记录可以根据它前面记录的指针进行定位。索引文件:只能通过索引来访 问记录。其结果是对记录的放置位置不再有限制,只要至少有一个索引的指针 指向这条记录即可。此外,还可以使用长度可变的记录。直接文件或散列 文件:直接文件使用基于关键字的散列。 12.6、为什么在索引顺序文件中查找一个记录的平均搜索时间小于在顺序文件中的平均 搜索时间? 答:在顺序文件中,查找一个记录是按顺序检测每一个记录直到有一个包含符合条件的关键域值的记录被找到。索引顺序文件提供一个执行最小穷举搜索的索引 结构。 12.7、对目录执行的典型操作有哪些? 答:搜索,创建文件,删除文件,显示目录,修改目录。 12.8、路径名和工作目录有什么关系? 答:路径名是由一系列从根目录或主目录向下到各个分支,最后直到该文件的路径 中的目录名和最后到达的文件名组成。工作目录是一个这样的目录,它是含有用 户正在使用的当前目录的树形结构。 12.9、可以授予或拒绝的某个特定用户对某个特定文件的访问权限通常有哪些? 答:无(none),知道(knowledge),执行(execution),读(reading),追加(appending), 更新(updating),改变保护(changing protection),删除(deletion)。 12.10、列出并简单定义三种组块方式。 答:固定组块(fixed blocking):使用固定长度的记录,并且若干条完整的记录被保存在一个块中。在每个块的末尾可能会有一些未使用的空间,称为内部碎片。

操作系统课程设计模拟文件系统

操作系统课程设计模拟文 件系统 Newly compiled on November 23, 2020

目录第1章需求分析 (1) 第2章概要设计 (1) 系统的主要功能 (1) 系统模块功能结构 (1) 运行环境要求 (2) 数据结构设计 (2) 第3章详细设计 (3) 模块设计 (3) 算法流程图 (3) 第4章系统源代码 (4) 第5章系统测试及调试 (4) 运行结果及分析 (4) 系统测试结论 (5) 第6章总结与体会 (6) 第7章参考文献 (6) 附录 (7) 第1章需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。

模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 第2章概要设计 系统的主要功能 1) 系统运行时根据输入的用户数目创建主目录 2) 能够实现下列命令: Login 用户登录 Create 建立文件 Read 读取文件 Write 写入文件 Delete 删除文件 Mkdir 建立目录 Cd 切换目录 Logout 退出登录 系统模块功能结构 运行环境要求 操作系统windows xp ,开发工具vc++ 数据结构设计 用户结构:账号与密码结构 typedef struct users { char name[8]; char pwd[10]; }users;

相关文档
最新文档