您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 操作系统----模拟UNIX文件系统的设计及实现
操作系统----模拟UNIX文件系统的设计及实现第1页共28页一、模拟UNIX文件系统流程图操作系统----模拟UNIX文件系统的设计及实现第2页共28页二、模拟UNIX文件系统源代码/*TYPEUnixFileSysSim.cpp*版权信息**文件名称:UnixFileSysSim.cpp*摘要:模拟实现UNIX的文件系统*****/#includeUnixFileSysSim.h/**函数介绍:寻找第一个空白的文件块ID*输入参数:无*输出参数:无*返回值:返回第一个空白块的ID*/unsignedFindBlankFileBlockId(){unsignedcharc;for(unsignedi=0;iFS.bm.BitMapLen/8;i++){c=FS.bm.BMStart[i]|0x7F;if(c==0x7F){returni*8;//一个字节左边第一位为0,表示该区域未使用}c=FS.bm.BMStart[i]|0xBF;if(c==0xBF){returni*8+1;}c=FS.bm.BMStart[i]|0xDF;if(c==0xDF){returni*8+2;}c=FS.bm.BMStart[i]|0xEF;操作系统----模拟UNIX文件系统的设计及实现第3页共28页if(c==0xEF){returni*8+3;}c=FS.bm.BMStart[i]|0xF7;if(c==0xF7){returni*8+4;}c=FS.bm.BMStart[i]|0xFB;if(c==0xFB){returni*8+5;}c=FS.bm.BMStart[i]|0xFD;if(c==0xFD){returni*8+6;}c=FS.bm.BMStart[i]|0xFE;if(c==0xFE){returni*8+7;}}returnFILEBLOCKCOU+1;}/**函数介绍:寻找第一个文件块地址*输入参数:fileblockid文件块ID*输出参数:无*返回值:返回文件块的地址*/char*FindBlankFileBlock(unsignedfileblockid){FileBlock*fblock=FS.head;while(fblock-next!=NULL){if(fblock-FileBlockId==fileblockid){returnfblock-FileBlockAddr;}else操作系统----模拟UNIX文件系统的设计及实现第4页共28页{fblock=fblock-next;}}returnNULL;}/**函数介绍:得到当前时间的字符串*输入参数:时间字符串的指针*输出参数:无*返回值:void*/voidGetCurrentTime(char*currtime){chardbuffer[9];chartbuffer[9];_strdate(dbuffer);_strtime(tbuffer);strcpy(currtime,dbuffer);strcat(currtime,);strcat(currtime,tbuffer);}/**函数介绍:更新文件索引*输入参数:fileblockid文件块ID*输出参数:无*返回值:无*/voidAddFileIndex(unsignedfileblockid,unsignedfilelevel,char*filename,char*parentname){FS.FI.FIStart[FS.FI.FICount].FileBlockId=fileblockid;FS.FI.FIStart[FS.FI.FICount].FileLevel=filelevel;strcpy(FS.FI.FIStart[FS.FI.FICount].FileName,filename);if(parentname==NULL){memset(FS.FI.FIStart[FS.FI.FICount].ParentName,'\0',MAXFILENAMELEN);}else{strcpy(FS.FI.FIStart[FS.FI.FICount].ParentName,parentname);}操作系统----模拟UNIX文件系统的设计及实现第5页共28页FS.FI.FIStart[FS.FI.FICount].Index=FS.FI.FICount;FS.FI.FIStart[FS.FI.FICount].effect=1;FS.FI.FICount++;}/**函数介绍:更新位示图*输入参数:fileblockid文件块ID*输出参数:无*返回值:无*/voidUpdateBitMap(unsignedfileblockid){//计复所在位示图的位置intdirInBitmap=((int)(fileblockid/8));intdirInChar=fileblockid%8;char*c=&(FS.bm.BMStart[dirInBitmap]);charxor;switch(dirInChar){case0:xor=0x80;break;case1:xor=0x40;break;case2:xor=0x20;break;case3:xor=0x10;break;case4:xor=0x08;break;case5:xor=0x04;break;case6:xor=0x02;break;case7:xor=0x01;操作系统----模拟UNIX文件系统的设计及实现第6页共28页break;}*c=*c^xor;}/**函数介绍:创建一个文件元素*输入参数:acc文件元素可操作权限,filename文件元素名称,type文件元素类型,filecontent文件内容*输出参数:无*返回值:返回一个文件元素的指针*/FSElement*CreateFileElement(FEAccessacc,char*filename,FETypetype,char*filecontent,FSElement*parent){//查找第一个空白文件块IDunsignedblankFileBlockId=FindBlankFileBlockId();if(blankFileBlockId=FILEBLOCKCOU){printf(未找到一个文件块的id\n);returnNULL;}//查找第一个空白块的地址char*blank=FindBlankFileBlock(blankFileBlockId);if(blank==NULL){printf(未找到一个文件块的地址\n);returnNULL;}FSElement*fs=(FSElement*)blank;fs-Access=acc;fs-Creator=CS.CurrentUser;GetCurrentTime(fs-CreateTime);fs-FileBlockId=blankFileBlockId;fs-FileLevel=CS.FileLevel;strcpy(fs-FileName,filename);strcpy(fs-LastModTime,fs-CreateTime);fs-Type=type;fs-parent=parent;if(type==dir)操作系统----模拟UNIX文件系统的设计及实现第7页共28页{fs-FileElemLen=sizeof(FSElement);fs-FileData=NULL;}else{fs-FileElemLen=(unsigned)strlen(filename);fs-fileStu=closed;fs-FileData=(char*)fs+sizeof(FSElement);if(filecontent==NULL){}else{strcpy(fs-FileData,filecontent);}}//更新索引if(parent==NULL){AddFileIndex(blankFileBlockId,CS.FileLevel,filename,NULL);}else{AddFileIndex(blankFileBlockId,CS.FileLevel,filename,parent-FileName);}//更新BITMAPUpdateBitMap(blankFileBlockId);returnfs;}/**函数介绍:创建文件块链表*输入参数:datahead第一块数据的地址,blockcap一个文件块的大小,len链表的长度*输出参数:无*返回值:返回链表的头指针*/FileBlock*CreateFileBlockList(char*datahead,unsignedblockcap,unsignedlen){if(datahead==NULL||len==0){returnNULL;操作系统----模拟UNIX文件系统的设计及实现第8页共28页}FileBlock*head;FileBlock*pnew;FileBlock*pold;head=pold=pnew=(FileBlock*)malloc(sizeof(FileBlock));for(unsignedi=0;ilen;i++){pold-FileBlockId=i;pold-FileBlockCap=FILEBLOCKCAP;pold-FileBlockAddr=datahead+i*blockcap;memset(pold-FileBlockAddr,'\0',blockcap);if(i!=len-1){pnew=(FileBlock*)malloc(sizeof(FileBlock));}else{pnew=NULL;}pold-next=pnew;pold=pnew;}returnhead;}/**函数介绍:初始化模拟文件系统*输入参数:无*输出参数:无*返回值:true-初始化成功,false-初始化失败*/boolInitFileSys(){//初始化模拟的文件系统if((FS.FSStart=(char*)malloc(FILESYSCAP))==NULL){returnfalse;}FS.FileSystemCap=FILESYSCAP;FS.bm.BitMapLen=BITMAPLEN;FS.bm.BMStart=FS.FSStart;操作系统----模拟UNIX文件系统的设计及实现第9页共28页//设置位示图为未使用memset(FS.bm.BMStart,'\0',FS.bm.BitMapLen);//初始化文件系统索引FS.FI.FIStart=(FileIndexElement*)(FS.FSStart+BITMAPLEN);//因为是模拟系统,暂定一个文件或文件夹最多占用一个文件块,一个文件块只放一个文件元素FS.FI.FILen=sizeof(FileIndexElement)*FILEBLOCKCOU+sizeof(unsigned)*2;FS.FI.FICount=0;memset(FS.FI.FIStart,'\0',FS.FI.FILen);//初始化文件块FS.FileBlockCou=FILEBLOCKCOU;FS.head=CreateFileBlockList((FS.FSStart+FILESYSCAP-FILEBLOCKCAP*FILEBLOCKCOU),FILEBLOCKCAP,FS.FileBlockCou);//区域的后FILEBLOCKCAP*FILEBLOCKCOU个单元用来存储数据if(FS.head==NULL){returnfalse;}//初始化系统当前状态CS.CurrentUser.UserName=(char*)calloc(10,sizeof(char));strcpy(CS.CurrentUser.UserName,man);CS.CurrentUs
本文标题:操作系统----模拟UNIX文件系统的设计及实现
链接地址:https://www.777doc.com/doc-3634797 .html