二级文件系统
- 格式:doc
- 大小:226.00 KB
- 文档页数:19
请简述 linux 中的文件系统层次结构
Linux系统的文件系统层次结构是非常复杂的,通常可以分成如下几个层次:
1. 根目录:根目录是 Linux 文件系统中最顶层的根目录,它可以看做是 Linux 系统整个文件系统的根,其它所有的子目录都在它之下,一般用 '/' 表示。
2. 二级目录:包括 '/etc'、'/usr'、'/bin'、'/sbin'、'/lib' 等,这些目录又可以看做是四级目录的父目录,下面可以放置用户自定义的文件和文件夹。
3. 四级目录:这里可以放置用户自定义的应用程序,一般都是以某个子目录名开头,比如 '/usr/local','/usr/bin'、'/usr/sbin'等。
4. 程序文件:可以放置各种程序文件,包括可执行文件、库文件、配置文件等。
5. 日志文件:记录系统的运行日志,以及用户行为日志,用于排查故障。
6. 数据文件:用户可以将各种数据文件存放在用户指定的目录下。
总之,Linux系统的文件系统层次结构比较复杂,它们可以根据用户需求和功能进行多层次的划分,以满足用户的不同需求。
操作系统课程设计报告专业:计算机信息处理学号:08201328姓名:杨馨雨提交日期:2011-7-14【设计目的】1.课程设计目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
2.结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
3.通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】1、delete删除文件2、open打开文件3、close关闭文件4、write写文件【实验环境】Windows7系统Visualstudio2010【相关知识综述】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
【设计思路】1主要数据结构#define MAXNAME25/*thelargestlengthofmfdname,ufdname,filename*/#define MAXCHILD50/*thelargestchild每个用户名下最多有50个文件*/#define MAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno*/typedefstruct/*thestructureofOSFILE定义主文件*/{int fpaddr;/*filephysicaladdress*/int flength;/*filelength*/int fmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/char fname[MAXNAME];/*filename*/}OSFILE;typedefstruct/*thestructureofOSUFD定义用户文件目录*/{char ufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;typedefstruct/*thestructureofOSUFD'LOGIN定义登陆*/{char ufdname[MAXNAME];/*ufdname*/char ufdpword[8];/*ufdpassword*/}OSUFD_LOGIN;typedefstruct/*fileopenmode定义操作方式*/{int ifopen;/*ifopen:0-close,1-open*/int openmode;/*0-readonly,1-writeonly,2-readandwrite,3-initial*/}OSUFD_OPENMODE;2主要函数void LoginF();/*LOGINFileSystem*/void DirF();/*DirFileSystem*/void CreateF();/*CreateFile*/void DeleteF();/*DeleteFile*/void ModifyFM();/*ModifyFileMode*/void OpenF();/*OpenFile*/void CloseF();/*CloseFile*/void ReadF();/*ReadFile*/void WriteF();/*WriteFile*/void QuitF();/*QuitFileSystem*/void CdF();/*ChangeDir*/void help();【主要程序段】1Delete函数voidDeleteF()/*DeleteFile*/{charfname[MAXNAME],str[50],str1[50];inti,k,j;intfpaddrno1;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)/*无法删除主目录的文件*/{printf("\.\n");wgetchar=1;}if(strcmp(strupr(dirname),strupr(username))!=0)/*无法删除非自己目录的文件*/{printf("\.\n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);fopen==1)/*文件打开时无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{fpaddrno1=ufd[k]->ufdfile[i].fpaddr;xt");remove(str);n",fname);wgetchar=1;}}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}2Open函数voidOpenF()/*OpenFile*/{charfname[MAXNAME];inti,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*在自己的目录里才能打开*/{printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++){printf("%15s",ufd[k]->ufdfile[j].fname);}printf("\nPleaseinputFileName:");gets(fname);fopen==1)'%s\'isinopenstatus.\n",fname);wgetchar=1;}else{ifopen[k][i].ifopen=1;mode==0)/*根据文件的模式设置打开模式*/{ifopen[k][i].openmode=0;}elseif(ufd[k]->ufdfile[i].fmode==1){ifopen[k][i].openmode=1;}elseif(ufd[k]->ufdfile[i].fmode==2){ifopen[k][i].openmode=2;}elseifopen[k][i].openmode=3;printf("\n\'%s\'isopenedsuccessfully\n",fname);wgetchar=1;}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}3Close函数voidCloseF()/*CloseFile*/{charfname[MAXNAME];inti,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*不在自己的目录里没法进行*/{printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++)/*列出已经打开的文件*/ {if(ifopen[k][j].ifopen==1)name);}printf("\nPleaseinputFileName:");gets(fname);fopen=0;/*关闭文件*/printf("\n\'%s\'closedsuccessfully\n",fname);wgetchar=1;}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}4Write函数voidWriteF()/*WriteFile*/{inti,k,n=0;intlength;charfname[MAXNAME],values[1000];charstr[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)n");wgetchar=1;return;}printf("\nCaution:Openfilefirst\n");printf("OpenedFile(s)List:\n");k=ExistD(dirname);fopen==1)name);n++;}if((n%4==0)&&(n!=0))printf("\n");}printf("\n%dfilesopenned.\n",n);if(n==0)wgetchar=1;fopen==1)penmode==1)||(ifopen[k][i].o penmode==2))paddr,str,10);xt");fp_file=fopen(str,"ab");length=ufd[k]->ufdfile[i].flengt h+length;n",ufd[k]->ufdfile[i].flength);printf("\n\nYouhavewritefilesuccessfully!!");fclose(fp_file);wgetchar=0;}elseif(ifopen[k][i].openmode==0)'%s\'\'twrite.\n",fname) ;wgetchar=1;}else'%s\'\'twrite.\n",fname);wgetchar=1;}}else'%s\'\n",fname);wgetchar=1;}}else'%s\'doesnotexist.\n",fname);wgetchar=1;}}}【程序流程设计】1总的功能结构图:2部分子模块程序流程图(1)打开命令的程序流程图:(2)关闭命令的程序流程图:(3)写命令的程序流程图:(4)删除命令的程序流程图:【测试结果】1删除文件2打开的文件不能删除3打开文件,其中已经打开的文件不能再次打开3关闭文件4写文件,其中只有打开了文件才能写入5写文件6只读文件和保护文件不能写入7其他函数【参考文献】计算机操作系统,西安电子科技大学出版社,方敏主编, 【源程序清单】#include""#include""#include""#include""#define MAXNAME25/*thelargestlengthofmfdname,ufdname,filename*/#define MAXCHILD50/*thelargestchild每个用户名下最多有50个文件*/#define MAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno*/typedefstruct/*thestructureofOSFILE定义主文件*/{int fpaddr;/*filephysicaladdress*/int flength;/*filelength*/int fmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/ char fname[MAXNAME];/*filename*/}OSFILE;typedefstruct/*thestructureofOSUFD定义用户文件目录*/{char ufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;typedefstruct/*thestructureofOSUFD'LOGIN定义登陆*/char ufdname[MAXNAME];/*ufdname*/char ufdpword[8];/*ufdpassword*/}OSUFD_LOGIN;typedefstruct/*fileopenmode定义操作方式*/{int ifopen;/*ifopen:0-close,1-open*/int openmode;/*0-readonly,1-writeonly,2-readandwrite,3-protect*/}OSUFD_OPENMODE;void LoginF();/*LOGINFileSystem*/void DirF();/*DirFileSystem*/void CreateF();/*CreateFile*/void DeleteF();/*DeleteFile*/void ModifyFM();/*ModifyFileMode*/void OpenF();/*OpenFile*/void CloseF();/*CloseFile*/void ReadF();/*ReadFile*/void WriteF();/*WriteFile*/void QuitF();/*QuitFileSystem*/void CdF();/*ChangeDir*/void help();char*rtrim(char*str);/*removethetrailingblanks.*/char*ltrim(char*str);/*removetheheadingblanks.*/void InputPW(char*password);/*inputpassword,use'*'replace*/int ExistD(char*dirname);/*WhetherDirNameExist,Exist-i,NotExist-0*/int WriteF1();/*writefile*/int ExistF(char*filename);/*WhetherFileNameExist,Exist-i,NotExist-0*/void SetPANo(int RorW);/*Setphysicaladdressnum*/int FindPANo();/*findoutphysicaladdressnum*/int ucount=0;/*thecountofmfd'sufds用户数*/int fcount[MAXCHILD];/*thecountofufd'sfiles子文件数*/int loginsuc=0;/*whetherloginsuccessfully登陆成功*/char username[MAXNAME];/*recordloginuser'sname22用户名*/char dirname[MAXNAME];/*recordcurrentdirectory使用的用户目录*/int fpaddrno[MAX];/*recordfilephysicaladdressnum物理地址号,存放自己所创建的所有文件的地址*/int wgetchar;/*whethergetchar()*/OSUFD*ufd[MAXCHILD];/*ufdandufdownfiles*/OSUFD_LOGINufd_lp;;QuitF();exit(0);break;case10:clrscr();choiceend=1;break;case11:CdF();choiceend=1;break;;}char*rtrim(char*str)/*removethetrailingblanks.去掉登陆用户名的尾空格*/int n=strlen(str)-1;while(n>=0){if(*(str+n)!=''){*(str+n+1)='\0';break;}else n--;}if(n<0)str[0]='\0';return str;}char*ltrim(char*str)/*removetheheadingblanks.去掉登陆用户名的头空格*/ {strrev(str);name),strupr(filename))==0){exist=1;break;}if(exist)return(i);elsereturn(-1);}int FindPANo()/*findoutphysicaladdressnum*/{int i;for(i=0;i<MAX;i++)if(fpaddrno[i]==0){fpaddrno[i]=1;break;}if(i<MAX)return(i);elsereturn(-1);}int WriteF1()/*writefile*/{int length=0;char c;printf("Pleaseinputtext(\'#\'standsforend):\n");while((c=getchar())!='#'){fprintf(fp_file,"%c",c);if(c!='\n')length++;}fprintf(fp_file,"\n");fclose(fp_file);return(length);}void LoginF()/*LOGINFileSystem登陆函数*/{char loginame[MAXNAME],loginpw[9],logincpw[9],str[50];xt");ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));fopen=0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLoginsuccessful!WelcometothisFileSystem\n\n");loginsuc=1;return;}else xt");if((fp_ufd=fopen(str,"rb"))==NULL){fp_ufd=fopen(str,"wb");fclose(fp_ufd);}fp_mfd=fopen("d:\\osfile\\","rb");for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++){strcpy(str,"d:\\osfile\\");strcat(str,;strcat(str,".txt");ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));strcpy(ufd[j]->ufdname,strupr);fp_ufd=fopen(str,"rb");for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)fopen =0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLoginSuccessful!WelcometothisSystem\n\n");loginsuc=1;return;}else");getch();clrscr();printf("\n%14s%16s%14s%10s%18s\n","FileName","FileAddress","FileLength","Type","Fil eMode");}itoa(ufd[j]->ufdfile[i].fpaddr,str,10);mode==0)strcpy(sfmode,"ReadOnly");elseif(ufd[j]->ufdfile[i].fmode==1)strcpy(sfmode,"WriteOnly");elseif(ufd[j]->ufdfile[i].fmode==2)strcpy(sfmode,"ReadAndWrite");else strcpy(sfmode,"Protect");printf("%14s%16s%14d%10s%18s\n",ufd[j]->ufdfile[i].fname,sfpaddr,ufd[j]->ufdfile[i] .flength,"<FILE>",sfmode);}printf("\n%3dfile(s)\n",fcount[j]);}else.");getch();clrscr();printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");}printf("%14s%18d%8s\n",ufd[i]->ufdname,fcount[i],"<UFD>");count=count+fcount[i];}printf("\n%3ddir(s),%5dfile(s)\n",ucount,count);}}void CreateF()/*CreateFile*/{int fpaddrno,flag=1,i;char fname[MAXNAME],str[50],str1[50],a[25];char fmode[25];if(strcmp(strupr(dirname),strupr(username))!=0)n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);ltrim(rtrim(fname));if(ExistF(fname)>=0){printf("\\'%s\'hasalreadyexisted.\n",fname);wgetchar=1;}else{printf("PleaseinputFileMode(0-ReadOnly,1-WriteOnly,2-ReadandWrite,3-Protect):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp( fmode,"3")==0)){fpaddrno=FindPANo();if(fpaddrno>=0)name,fname);paddr=fpaddrno;ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);ifopen[i][fcount[i]].ifopen=0;ifopen[i][fcount[i]].openmode=4;strcpy(str,"d:\\osfile\\file\\file");itoa(fpaddrno,str1,10);strcat(str,str1);strcat(str,".txt");fp_file=fopen(str,"wb");fclose(fp_file);fcount[i]++;while(flag){printf("Inputtextnow(Y/N):");gets(a);ltrim(rtrim(a));ufd[i]->ufdfile[fcount[i]-1].flength=0;if(strcmp(strupr(a),"Y")==0){fp_file=fopen(str,"wb+");length=WriteF1();flag=0;}elseif(strcmp(strupr(a),"N")==0){flag=0;wgetchar=1;}}printf("\n\'%s\'hasbeencreatedsuccessfully!\n",fname);}else{printf("\nFail!.\n");wgetchar=1;}}else{printf("\\'sRangeis0-3\n");wgetchar=1;}}}}void DeleteF()/*DeleteFile*/{char fname[MAXNAME],str[50],str1[50];int i,k,j;int fpaddrno1;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)/*无法删除主目录的文件*/{printf("\.\n");wgetchar=1;}if(strcmp(strupr(dirname),strupr(username))!=0)/*无法删除非自己目录的文件*/ {printf("\.\n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);fopen==1)/*文件打开时无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{fpaddrno1=ufd[k]->ufdfile[i].fpaddr;xt");remove(str);n",fname);wgetchar=1;}}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void ModifyFM()/*ModifyFileMode*/{char fname[MAXNAME],str[50];int i,k;char fmode[25];/*whetherdelete*/if(strcmp(strupr(dirname),strupr(username))!=0){printf("\.\n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==0)strcpy(str,"readonly");/*FileMode*/elseif(ufd[k]->ufdfile[i].fmode==1)strcpy(str,"writeonly");elseif(ufd[k]->ufdfile[i].fmode==2)strcpy(str,"readandwrite");else strcpy(str,"Protect");printf("\'%s\'filemodeis%s.\n",fname,strupr(str));printf("Modifyto(0-readonly,1-writeonly,2-readandwrite,3-Protect):");gets(fmode);ltrim(rtrim(fmode));if(strcmp(fmode,"0")==0){ufd[k]->ufdfile[i].fmode=0;printf("\n\'%s\'hasbeenmodifiedtoREADONLYmodesuccessfully.\n",fname);wgetchar=1;}elseif(strcmp(fmode,"1")==0){ufd[k]->ufdfile[i].fmode=1;printf("\n\'%s\'hasbeenmodifiedtoWRITEONLYmodesuccessfully.\n",fname);wgetchar=1;}elseif(strcmp(fmode,"2")==0){ufd[k]->ufdfile[i].fmode=2;printf("\n\'%s\'hasbeenmodifiedtoREADANDWRITEmodesuccessfully.\n",fname);wgetchar=1;}elseif(strcmp(fmode,"3")==0){ufd[k]->ufdfile[i].fmode=3;printf("\n\'%s\'hasbeenmodifiedtoFORBIDmodesuccessfully.\n",fname);wgetchar=1;}else{printf("\nError.\'%s\'isnotmodified.\n",fname);wgetchar=1;}}}else{printf("\nError.\'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void OpenF()/*OpenFile*/{char fname[MAXNAME];int i,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*在自己的目录里才能打开*/ {printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++){printf("%15s",ufd[k]->ufdfile[j].fname);}printf("\nPleaseinputFileName:");gets(fname);fopen==1)'%s\'isinopenstatus.\n",fname);wgetchar=1;}else{ifopen[k][i].ifopen=1;mode==0)/*根据文件的模式设置打开模式*/{ifopen[k][i].openmode=0;}elseif(ufd[k]->ufdfile[i].fmode==1){ifopen[k][i].openmode=1;}elseif(ufd[k]->ufdfile[i].fmode==2){ifopen[k][i].openmode=2;}else ifopen[k][i].openmode=3;printf("\n\'%s\'isopenedsuccessfully\n",fname);wgetchar=1;}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void CloseF()/*CloseFile*/{char fname[MAXNAME];int i,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*不在自己的目录里没法进行*/ {printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++)/*列出已经打开的文件*/{if(ifopen[k][j].ifopen==1)name);}printf("\nPleaseinputFileName:");gets(fname);fopen=0;'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void ReadF()/*ReadFile*/{int i,k,n=0;char fname[MAXNAME];char str[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)n");wgetchar=1;return;}printf("\nCaution:Openfilefirst\n");printf("OpenedFile(s)List:\n");k=ExistD(dirname);for(i=0;i<fcount[k];i++){if(ifopen[k][i].ifopen==1)name);n++;}if((n%4==0)&&(n!=0))printf("\n");}printf("\n%dfilesopenned.\n",n);if(n==0)wgetchar=1;fopen==1){if((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2))paddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"d:\\osfile\\file\\");strcat(str,str1);strcat(str,".txt");fp_file=fopen(str,"rb");fseek(fp_file,0,0);printf("\nThetextis:\n\n");printf("");while(fscanf(fp_file,"%c",&c)!=EOF)if(c=='\n')printf("\n");else printf("%c",c);printf("\n\n%dLength.\n",ufd[k]->ufdfile[i].flength);fclose(fp_file);wgetchar=1;}elseif(ifopen[k][i].openmode==1)'%s\'\'tread.\n",fname);wgetchar=1;}else'%s\'\'tread.\n",fname);wgetchar=1;}}else{printf("\nError.\'%s\'\n",fname);wgetchar=1;}}else{printf("\nError.\'%s\'doesnotexist.\n",fname);wgetchar=1;}}}void WriteF()/*WriteFile*/{int i,k,n=0;int length;char fname[MAXNAME],values[1000];char str[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)n");wgetchar=1;return;}printf("\nCaution:Openfilefirst\n");printf("OpenedFile(s)List:\n");k=ExistD(dirname);fopen==1)name);n++;}if((n%4==0)&&(n!=0))printf("\n");}printf("\n%dfilesopenned.\n",n);if(n==0)wgetchar=1;fopen==1)penmode==1)||(ifopen[k][i].openmode==2))paddr,str,10);x t");fp_file=fopen(str,"ab");length=ufd[k]->ufdfile[i].flength+length;n",ufd[k]->ufdfile [i].flength);printf("\n\nYouhavewritefilesuccessfully!!");fclose(fp_file);wgetchar=0;}elseif(ifopen[k][i].openmode==0)'%s\'\'twrite.\n",fname);wgetchar=1;}else'%s\'\'twrite.\n",fname);wgetchar=1;}}else'%s\'\n",fname);wgetchar=1;}}else'%s\'doesnotexist.\n",fname);wgetchar=1;}}}void QuitF()/*QuitFileSystem*/{int i,j;char str[50];SetPANo(1);if(fp_mfd!=NULL)fclose(fp_mfd);xt");fp_ufd=fopen(str,"wb");fclose(fp_ufd);fp_ufd=fopen(str,"ab");for(i=0;i<fcount[j];i++)fwrite(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd);fclose(fp_ufd);}}void CdF()/*ExchangeDir更换用户*/{char dname[MAXNAME];printf("\nPleaseinputDirName:");gets(dname);ltrim(rtrim(dname));if(ExistD(dname)>=0)strcpy(dirname,strupr(dname));elseif(strcmp(strupr(dname),"CD..")==0)strcpy(ltrim(rtrim(dirname)),"");else printf("\nError.\'%s\'doesnotexist.\n",dname);}void help(void){printf("\nTheCommandList\n");printf("\nCdAttribCreatewriteReadOpenClsDeleteExitClose\n");}【设计总结】UNIX系统中的文件系统是人们最感兴趣的,也是最成功的一部分。
武汉理工大学华夏学院课程设计课程名称操作系统课程设计题目为LINUX 设计一个简单的二级文件系统专业软件技术班级2081班姓名陶静成绩指导教师赵传斌、司晓梅2011年1月17日至2011年1月21日课程设计任务书设计题目:为LINUX 设计一个简单的二级文件系统设计目的:1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
2、提高学生的程序设计能力、提高算法设计质量与程序设计素质。
设计任务:(在规定的时间内完成下列任务)为LINUX 设计一个简单的二级文件系统。
要求做到以下几点:1、可以实现下列几条命令(至少4条)2、列目录时要列出文件名、物理地址、保护码和文件长度。
3、源文件可以进行读写保护。
时间安排:1月 17日布置课程设计任务;分配题目后,查阅资料、准备程序;1月 18日~1月20 日上机调试程序、书写课程设计报告;1月21 日上午提交课程设计报告及相关文档。
地点:学校机房(具体见现代教育中心大屏幕安排)具体要求:1、课程设计报告按统一通用格式书写,具体格式要求请在网络上查阅2、每位学生应独立完成各自的任务且每天至少在设计室工作半天指导教师签名:11年1月7日教研室主任(或责任教师)签名:11年1月7 日Login 用户登录Dir 列文件目录Create 创建文件Delete 删除文件Open 打开文件Close 关闭文件Read 读文件Write 写文件目录一.项目概述 (4)二.课程设计设计题目 (4)三.开发语言及实现平台或实验环境 (4)四.设计目的 (4)五.设计内容 (4)5.1.任务 (4)5.2.主程序流程图 (5)六.程序设计 (5)6.1.设计思想 (5)6.2.设计要求 (5)七.设计原理 (6)7.1.外存管理 (6)7.2.linux的EXT2文件系统 (6)7.3.用内存来模拟外存 (6)7.4.编码 (7)八.测试界面 (15)九.参考文献 (17)十.设计心得体会 (17)十一.设计过程中的疑问 (18)十二.指导教师评语 (18)一.项目概述Linux是一个性能稳定、功能强大、效率高的操作系统。
计算机二级操作系统知识点解答操作系统(Operating System,简称OS)是一种用于控制和管理计算机硬件资源和软件资源的系统软件。
它是计算机系统中最基本的软件之一,负责启动、加载和运行其他程序,并提供用户与计算机硬件之间的接口。
计算机二级操作系统考试是计算机技术和信息化专业技术资格考试(水平测试),是一个评价计算机操作系统知识掌握程度的证书考试。
下面将介绍计算机二级操作系统知识点,并对其中的一些重要概念做详细解答。
一、操作系统基本概念1.操作系统的定义和作用操作系统是计算机硬件与应用程序之间的桥梁,它负责管理计算机硬件资源,为应用程序提供运行环境,提高计算机的资源利用率。
2.操作系统的基本功能操作系统的基本功能包括:进程管理、内存管理、文件系统管理和设备管理。
其中,进程管理负责管理计算机上运行的进程;内存管理负责管理计算机的内存资源;文件系统管理负责管理硬盘上的文件;设备管理负责管理计算机的各种外设。
二、进程管理进程是计算机中执行的程序的实体,线程是进程中的一个执行单元。
进程是资源分配的基本单位,线程是CPU调度的基本单位。
一个进程可以包含多个线程。
2.进程调度算法常见的进程调度算法有:先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转调度等。
三、内存管理1.内存地址空间内存地址空间是指计算机系统中可被程序使用的内存地址的范围。
根据不同的操作系统和硬件架构,内存地址空间可划分为逻辑地址空间和物理地址空间。
2.分段和分页的内存管理方式分段和分页是常见的内存管理方式。
分段将内存划分为多个段,每个段具有不同的大小,属于进程的逻辑地址空间;分页将内存划分为固定大小的页,属于进程的物理地址空间。
四、文件系统管理1.文件系统的组成部分文件系统由文件、文件目录和文件存储器组成。
文件是存储在二级存储器中的数据集合;文件目录是文件的组织结构;文件存储器是存储文件的物理介质。
2.文件系统的文件管理方式文件管理方式包括顺序文件、索引文件和链式文件等。
模拟简单二级文件管理系统简单二级文件管理系统是一种用于管理和组织计算机文件的软件系统。
它提供了一种方便的方式来浏览、创建、修改和删除文件,以及对文件进行分类和搜索。
本文将介绍如何设计和实现一个模拟简单二级文件管理系统。
一、系统概述模拟简单二级文件管理系统是一个基于命令行界面的文件管理系统。
用户可以通过输入不同的命令来执行文件管理操作,如创建文件夹、创建文件、查看文件列表、移动文件等。
系统支持两级文件结构,即可以在根目录下创建文件夹,并在文件夹下创建文件。
系统还提供了文件搜索功能,用户可以根据文件名或文件类型进行搜索。
二、系统功能1. 创建文件夹:用户可以通过输入命令,在指定路径下创建一个新的文件夹。
2. 创建文件:用户可以通过输入命令,在指定路径下创建一个新的文件。
3. 查看文件列表:用户可以通过输入命令,查看指定路径下的文件夹和文件列表。
4. 移动文件:用户可以通过输入命令,将指定文件或文件夹移动到目标路径下。
5. 复制文件:用户可以通过输入命令,将指定文件或文件夹复制到目标路径下。
6. 删除文件或文件夹:用户可以通过输入命令,删除指定的文件或文件夹。
7. 文件搜索:用户可以通过输入命令,根据文件名或文件类型进行文件搜索。
三、系统设计1. 数据结构系统使用树状结构来表示文件系统,每个节点表示一个文件夹或文件。
节点包含以下属性:- 名称:节点的名称,可以是文件夹名称或文件名称。
- 类型:节点的类型,可以是文件夹或文件。
- 父节点:指向父节点的指针,用于表示文件夹的层次结构。
- 子节点列表:包含子节点的列表,用于表示文件夹下的文件和文件夹。
2. 系统流程系统的主要流程如下:- 用户输入命令。
- 系统解析命令,判断执行的操作类型。
- 根据操作类型,执行相应的操作。
- 更新文件系统的数据结构。
- 返回执行结果给用户。
四、系统实现系统可以使用编程语言来实现,如Python。
以下是一个简单的实现示例:```pythonclass Node:def __init__(self, name, type): = nameself.type = typeself.parent = Noneself.children = []class FileSystem:def __init__(self):self.root = Node("root", "folder")def create_folder(self, path, name):# 创建文件夹的逻辑def create_file(self, path, name):# 创建文件的逻辑def list_files(self, path):# 查看文件列表的逻辑def move_file(self, source_path, target_path): # 移动文件的逻辑def copy_file(self, source_path, target_path): # 复制文件的逻辑def delete_file(self, path):# 删除文件的逻辑def search_file(self, path, keyword):# 文件搜索的逻辑# 创建文件系统对象file_system = FileSystem()# 用户输入命令command = input("请输入命令:")# 解析命令并执行相应的操作# ...# 更新文件系统的数据结构# ...# 返回执行结果给用户# ...```以上是一个简单的模拟二级文件管理系统的设计和实现。
⽂件系统概述⼀、概述操作系统对系统的软件资源(不论是应⽤软件和系统软件)的管理都以⽂件⽅式进⾏,承担这部分功能的操作系统称为⽂件系统。
1、⽂件计算机系统对系统中软件资源:⽆论是程序或数据、系统软件或应⽤软件都以⽂件⽅式来管理。
⽂件是存贮在某种介质上的(如磁盘、磁带等)并具有⽂件名的⼀组有序信息的集合。
⽂件名是由字符和数字组成的,例如MS-DOS中⽂件名由三部分组成,格式如下:[<盘符>] <⽂件名> [.扩展名]。
格式 [ ] 中是可以省略,盘符为存放⽂件的磁盘驱动器号,如⽤A:和C:分别表⽰软盘和硬盘驱动器;⽂件名由1∽8个字符组成。
扩展名为由“.”开始的1-3个字符组成,如.EXE表⽰可执⾏的浮动代码⽂件,.TXT表⽰ASCⅡ码⽂本⽂件,.LIB表⽰库⽂件,.BAT表⽰批处理⽂件等。
UNIX ⽂件系统将⽂件分成普通⽂件、⽬录⽂件、设备⽂件(特殊⽂件)和符号连接⽂件(Symbolic link)等⼏类,UNIX把所有I/O设备作为特殊⽂件,对I/O设备操作模仿为对普通⽂件的存取,这样将⽂件与设备的I/O尽可能统⼀起来。
数据项是描述⼀个对象的某些属性的字符集,它是数据的基本单位,⼀个数据项有⼀个值。
记录是⼀组相关数据项的集合,⽤于描述⼀个对象某⽅⾯的属性。
⽂件是具有⽂件名的⼀组相关记录的集合。
数据库是相关数据的集合。
2、⽂件系统⽂件系统是操作系统中以⽂件⽅式管理计算机软件资源的软件和被管理的⽂件和数据结构(如⽬录和索引表等)的集合。
从系统⾓度来看,⽂件系统是对⽂件存储器的存储空间进⾏组织、分配和回收,负责⽂件的存储、检索、共享和保护。
从⽤户⾓度来看,⽂件系统主要是实现“按名存取”,⽂件系统的⽤户只要知道所需⽂件的⽂件名,就可存取⽂件中的信息,⽽⽆需知道这些⽂件究竟存放在什么地⽅。
⽂件系统的类型:(1)FAT⽂件系统(MS-DOS⽂件系统、msdos)它是MS-DOS操作系统使⽤的⽂件系统,它也能由Windows98/NT、linux、SCO UNIX等操作系统访问。
ext2 文件系统格式The Second Extended File System(ext2)文件系统是 Linux 系统中的标准 文件系统,是通过对 Minix 的文件系统进行扩展而得到的,其存取文件的性能 极好。
在 ext2 文件系统中,文件由 inode(包含有文件的所有信息)进行唯一标识。
一个文件可能对应多个文件名,只有在所有文件名都被删除后,该文件才会被 删除。
此外,同一文件在磁盘中存放和被打开时所对应的 inode 是不同的,并 由内核负责同步。
ext2 文件系统采用三级间接块来存储数据块指针,并以块 (block,默认为 1KB)为单位分配空间。
其磁盘分配策略是尽可能将逻辑相 邻的文件分配到磁盘上物理相邻的块中, 并尽可能将碎片分配给尽量少的文件, 以从全局上提高性能。
ext2 文件系统将同一目录下的文件(包括目录)尽可能 的放在同一个块组中,但目录则分布在各个块组中以实现负载均衡。
在扩展文 件时,会尽量一次性扩展 8 个连续块给文件(以预留空间的形式实现)。
2.1. 总体存储布局 请点评我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例 如某种 mkfs 命令)格式化成某种格式的文件系统,然后才能存储文件,格式 化的过程会在磁盘上写一些管理存储布局的信息。
下图是一个磁盘分区格式化 成 ext2 文件系统后的存储布局。
图 1. ext2 文件系统的总体存储布局文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确 定的,例如 mke2fs 的-b 选项可以设定块大小为 1024、2048 或 4096 字节。
而上图中启动块(Boot Block)的大小是确定的,就是 1KB,启动块是由 PC 标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启 动块。
启动块之后才是 ext2 文件系统的开始, ext2 文件系统将整个分区划成若干 个同样大小的块组(Block Group),每个块组都由以下部分组成。
XXXXXXXXX有限公司一、目的:明确公司所有GMP文件的分类管理办法,使文件的管理规范有序,方便编制与查阅。
二、范围:适用于公司GMP文件。
三、责任:各有关部门的负责人、管理人员、文件管理员及起草人。
四、内容:1.GMP文件分类GMP文件包括标准类和记录类,其中标准类分为:技术标准、管理标准、工作标准三类;记录分为:过程记录、台帐记录及标记(凭证)三类。
1.1技术标准:包括工艺规程、质量标准和外来技术文件。
外来技术文件主要指接受委托生产时委托方提供的技术文件。
1.2管理标准是指为了行使管理职能,使管理标准化、规范化而制定的书面要求。
1.3工作标准1.3.1 部门职责及岗位职责部门职责是指企业将所有工作按其性质划分给职能部门,对各部门的工作范围、标准、责任、权限等制定的书面要求。
岗位职责是指为了完成某管理岗位的工作,对该岗位的工作范围、职责、标准等制定的书面要求。
1.3.2 标准操作规程(SOP)标准操作规程(SOP)是以人为对象,对某项具体工作的范围、职责、工作方法、工作内容及工作程序等制定的书面要求。
1.4 记录记录是反映企业在药品生产、质量管理实际工作中执行标准的情况及结果的文件。
记录按记载方式可分为三类:过程记录、台帐记录及标志(凭证)。
1.4.1 过程记录:包括但不限于批生产记录、批包装记录、质量监控及检验记录、设备使用记录、厂房及设备维护记录、计量器具及仪器仪表校验记录、销售记录、自检记录、返工记录、投诉及退货处理记录等。
1.4.2 台帐记录:包括但不限于台帐(教育、设备、不合格品、用户投诉等),卡(货位卡、中间产品卡等),单(请验单、检验报告书等)。
1.4.3 标志、凭证:包括但不限于标志(状态、流向等),凭证(取样、清场、卫生等)。
2.文件系统分类级别2.1公司GMP文件系统分为二级管理,即一级文件和二级文件。
2.1.1一级文件系统包括:SMP、JB及SOP通用型文件及记录。
2.1.2二级文件系统包括:除一级文件以外的其余文件及记录。
青岛理工大学操作系统课程设计报告院(系):计算机工程学院专业:计算机科学与技术班级:_计算122学生姓名:马鹏__学号: 201207059欧阳涛__201207060 题目:___模拟二级文件管理系统__起迄日期:_ 2015.07.13-2015.07.24___设计地点:现代教育中心B303、B305指导教师:熊晓芸2014—2015年度第 2 学期完成日期: 2015 年 7 月 24 日一、课程设计目的通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。
进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。
同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。
二、课程设计内容及小组成员分工1.设计内容:通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统1)能够实现下列命令:●Login 用户登录●Dir 列文件目录●Create 创建文件●Delete 删除文件●Open 打开文件●Close 关闭文件●Read 读文件●Write 写文件●Bit 显示外部存储空间的位示图(按16*16的形式显示)2)系统能检查键入命令的正确性,出错时应能显示出错原因3)列目录时要列出文件目录、文件名和文件长度,以及系统总容量,占用容量、空闲容量(容量以字节为单位)4)不允许对打开的文件执行重复打开操作或执行删除操作5)外部存储空间的大小为256个Block,每个Block的大小为512字节,盘块号从1开始编号6)文件系统对外部存储空间采用连续分配的方式控制块的大小为32字节,其中文件名字占8个字节,参照MS-DOS设计文件控制块的数据结构;FAT由文件名、起始盘块号,长度、最后一块字节数四部分组成,占12个字节,磁盘的目录最大能存放256个目录项。
6.1 本章知识点操作系统管理的资源有硬资源和软资源,软资源的一个重要方面指的是文件。
我们的程序和数据等都要以文件的形式存放在系统中,所以文件系统与用户的关系也最为密切。
操作系统通过管理多种存储设备来执行抽象的文件概念。
由于计算机系统需要处理的信息量太大,不可能把所有的信息全部保存到内存中,而往往将其中的绝大部分保存在外存,通常是保存在磁盘中,只有那些相对稳定(即不经常使用与修改)的信息才保存在磁带中。
然而,在多用户系统中,既要保证各用户的信息存放位置不冲突,又要防止任一用户大量占用外存空间而不使用;既要保证用户的信息不被非法窃取或破坏,又要允许在许可的情况下多个用户共享。
显然,这一切都是单个用户无法胜任的,需要有一个公共的管理机构来负责统一使用外存空间,管理外存空间的信息,这就引入了文件系统。
本章的主要知识点为:(1)文件分类文件是被命名的数据的集合体,是由操作系统定义和实施管理的抽象数据类型。
可以从不同的角度来划分文件的类型:按用途分为:系统文件、库文件、用户文件;按文件中的数据形式分为:源文件、目标文件、可执行文件;按存取权限分为:只读文件、读写文件、可执行文件;按保存时间分为:临时文件、永久文件;在UNIX/Linux和MS-DOS系统中,文件分为普通文件、目录文件和特殊文件。
而普通文件又分为ASCII文件和二进制文件两种。
不同的文件系统对文件的命名规则是不同的,通常由文件名和扩展名(即后缀)组成。
一般利用扩展名可区分文件的属性。
(2)文件系统的功能文件系统是操作系统中负责操纵和管理文件的一整套机制,它实现文件的共享和保护,方便用户“按名存取”。
文件系统为用户提供了存取简便、格式统一、安全可靠的管理各种文件信息的方法。
一般说来,文件系统应具备以下功能:文件管理(如创建/删除文件,对文件的各种操作等)、目录管理(创建/删除目录项,权限验证等)、文件存储空间的管理(如外存空间的分配与回收)、文件的共享和保护以及提供方便的对外接口(如实现按名存取,文件系统调用等)。
实验七二级目录文件系统设计6.1.1 目的和要求本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
6.1.2 实验内容为DOS系统设计一个简单的二级文件系统。
要求做到以下几点:(1)可以实现下列几条命令LOGIN 用户登陆DIR 列文件目录CREAT 创建文件DELETE 删除文件OPEN 打开文件CLOSE 关闭文件READ 读文件WRITE 写文件(2)列目录时要列出文件名,物理地址,保护码和文件长度。
(3)源文件可以进行读写保护。
6.1.3 实验环境(1)PC兼容机(2)Windows、DOS系统(3)TC语言6.1.4 实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
6.1.5 实验参考代码参考程序见下(本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录):实验过程:(1)将TC 创建于一个单独的文件夹里(2)打开TC.exe 然后配置运行环境:(根据地址栏中的信息确定环境配置变量)(3)将实验报告中的实验代码复制到一个单独的.c文件中去,命名为2.c:(4)运行2.c文件:(5)执行程序:创建文件:创建过程:删除过程:实验总结与心得(1)本次试验,利用一个简单的多用户文件系统根据代码的提示吧可以学写出有关系统创建文件的过程,包含具体的登录创建列出用户目录,删除文件,打开文件,关闭文件,读写文件等操作。
(2)在二级文件系统中,需要在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统,其中文件物理结构可采用显式链接或其他方法,磁盘空闲空间的管理可选择位示图或其他方法,可以采用位示图来管理文件存储空间,并采用显式链接分配方式;(3)在实验的过程中遇到问题,由于刚接触TC软件,在开始使用的时候出现了点问题经过老师的讲解,才学会了会用软件,在实验的过程中把上午才学过的知识复习了一遍。
计算机二级常见错误解析计算机二级考试是广泛认可的计算机能力测试,对于计算机从业人员和学生来说具有重要的参考价值。
然而,在考试过程中,许多考生常常会犯一些常见的错误。
本文旨在分析并解析计算机二级考试中常见的错误,并为考生提供相应的解决方法。
一、操作系统错误解析1. 进程管理错误在操作系统中,进程管理是一个重要的概念。
常见的进程管理错误包括进程调度错误、进程同步与互斥错误等。
进程调度错误可能导致程序运行时间过长或过短,影响计算机的整体性能。
而进程同步与互斥错误可能导致并发程序出现死锁或数据不一致的情况。
解决方法:掌握常见的进程调度算法,如先来先服务、短作业优先等,并根据不同的应用场景选择合适的算法。
同时,了解进程同步与互斥的机制,掌握信号量、互斥锁等相关知识,以避免并发程序出现错误。
2. 文件系统错误在操作系统中,文件系统是管理计算机存储设备上文件的一种方式。
常见的文件系统错误包括文件读写错误、文件权限错误等。
文件读写错误可能导致文件损坏或丢失,而文件权限错误则可能导致无法正常访问文件。
解决方法:掌握文件读写操作的基本方法,并注意文件路径、文件名的正确性。
此外,了解文件权限的设置方法,确保文件能够被正确地读写。
二、数据库错误解析1. 数据库查询错误在数据库操作中,查询是最常见的操作之一。
常见的数据库查询错误包括查询条件错误、查询语句错误等。
查询条件错误可能导致无法获取到想要的结果,而查询语句错误则可能导致语法错误或逻辑错误。
解决方法:仔细检查查询条件的正确性,确保查询条件与所需结果相匹配。
同时,熟悉数据库查询语句的语法,避免语法错误或逻辑错误的出现。
2. 数据库事务错误在数据库操作中,事务是确保数据一致性的重要机制。
常见的数据库事务错误包括事务隔离级别错误、事务提交错误等。
事务隔离级别错误可能导致数据不一致的情况,而事务提交错误则可能导致事务无法生效或产生脏数据等问题。
解决方法:了解常见的事务隔离级别,如读未提交、读已提交、可重复读等,并根据实际需求选择合适的隔离级别。
二级目录文件系统的增删查改的数据结构链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
通俗理解,链表就是把数据块连接起来,还方便拆卸。
可以随时将数据块加入进去,或者拿出去。
注意,在头插尾插操作中,我们传递的都是二级指针。
因为节点本身就是指针,我们知道按地址传参才可以改变原值,由于plist本身就是指针。
头插相对于尾插更好实现,只需要在头节点前链接上新节点就好。
但是尾插则需要考虑的更多一些,实现我们要判断链表此时是否为空,如果是空则不需尾插,如果非空,我们则需要首先找到链表的尾,在尾上插入新的节点。
二级分区表,hdfs 路径摘要:I.二级分区表简介A.二级分区表的概念B.二级分区表的作用C.HDFS 中的二级分区表II.HDFS 路径A.HDFS 路径的概念B.HDFS 路径的组成C.HDFS 路径的使用方法D.二级分区表与HDFS 路径的关系III.二级分区表与HDFS 路径的应用A.数据存储与访问B.数据备份与恢复C.数据压缩与优化IV.二级分区表与HDFS 路径的未来发展A.技术挑战B.发展趋势C.对我国大数据产业的影响正文:I.二级分区表简介二级分区表是一种数据存储管理技术,它将数据按照一定的规则分成多个区域,从而提高数据存储与管理的效率。
二级分区表广泛应用于大数据领域,尤其在HDFS(Hadoop 分布式文件系统)中有着重要的应用。
A.二级分区表的概念:二级分区表是一种将数据划分为多个子集的方法,通常包括一级分区和二级分区。
一级分区根据数据的类型、时间、地理位置等属性进行划分,二级分区则在一级分区的基础上进一步细分。
B.二级分区表的作用:二级分区表的主要作用是提高数据存储与管理的效率。
通过将数据划分为多个分区,可以降低数据冗余,提高数据访问速度,便于数据的管理与维护。
C.HDFS 中的二级分区表:HDFS 是一个分布式文件系统,用于存储大规模数据集。
在HDFS 中,二级分区表用于存储和管理数据,它可以根据数据的特点进行合理的划分与组织,从而提高数据的存储效率。
II.HDFS 路径HDFS 路径是HDFS 中用于表示文件或目录的一种标识符,它由多个组件组成,用于描述数据在HDFS 中的位置。
A.HDFS 路径的概念:HDFS 路径是一种用于表示HDFS 中文件或目录的方式,它由多个组件构成,每个组件之间用"/"分隔。
HDFS 路径从根目录(如"/")开始,逐级向下表示数据在HDFS 中的位置。
B.HDFS 路径的组成:HDFS 路径由多个组件构成,包括:1.根目录(如"/"):表示HDFS 的顶层目录。
二级节点应用案例可能是指在网络或者树状结构中,一个节点的下一级子节点所涉及的具体实例。
举例来说,在计算机科学领域的树状数据结构中,每个节点都可以有多个子节点,而这些子节点即可被视作此节点的二级节点。
以下是几个关于二级节点应用案例的示例:
1. 文件系统:
在计算机文件系统中,根目录可以被视作一级节点,而其下的各个文件夹即可被视作二级节点。
例如,假设“C:\”为根目录,那么“C:\Program Files”和“C:\Users”等文件夹就可作为“C:\”的二级节点。
2. 组织架构:
在企业组织架构中,公司总部可以被视作一级节点,而各个部门则可被视作二级节点。
例如,总部下的“市场部”、“销售部”、“人力资源部”等部门可以作为一级节点“总部”的二级节点。
3. 网络拓扑结构:
在计算机网络拓扑结构中,某个网络的总控制器可以被视作一级节点,而各个子网络则可被视作二级节点。
例如,总控制器下的“局域网A”、“局域网B”等子网络可以作为一级节点“总控制器”的二级节点。
以上是关于二级节点应用案例的简单示例,二级节点在不同领域和结
构中有着广泛的应用,用来组织和管理具体实例。
《计算机操作系统》课程设计题目:二级文件系统专业:计算机科学与技术班级:姓名:学号:指导教师:时间:2011.6.01---2011.6.102011年6 月13日一、实验内容为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login用户登录dir 列目录create创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件2.列目录时要列出文件名,物理地址,保护码和文件长度二、实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
三、开发环境Windows操作系统Microsoft Visual C++四、分析设计实验原理通过程序模拟Linux文件系统,用一个二进制文件(FileSystem.disk)来模拟磁盘.设计一个多用户的二级文件系经统、实现一般的创建文件、目录,删除文件、目录,切换目录,打开、关闭文件、读写文件等操作。
文件系统,包含格式化,显示文件(目录),创建文件等几个简单命令的实现,而且能完成超级块的读写,节点的读写等过程. 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。
另外,为了简单本文件系统未考虑文件共享、文件系统安全以及管道文件与设备文件等特殊内容。
1.程序执行流程图:2.数据块的分配和回收设计FileSystem类负责管理磁盘空间和磁盘内存I节点,负责对磁盘空间和磁盘数据进行优化管理。
并提代接口言方法供用户或程序调用。
五、打印的源程序及附上的注释#include "xd.h" //文件管理void createFile(char fileName[],int length,char fileKind[]); //创建文件void fileWrite(char fileName[]); //写文件void fileCat(char fileName[]); //读文件void fileRen(char fileName[],char rename[]); //重命名文件void fileClose(char fileName[]); //关闭已打开的文件void delFile(char fileName[]); //删除文件int requestDist(int &startPostion,int maxLength); //磁盘分配查询void initDisk(); //初始化磁盘void freeDisk(int startPostion); //磁盘空间释放//用户管理void userCreate();int login();int userID=-1; //用户登录的ID号,值为-1时表示没有用户登录//用户注册void userCreate(){char c;char userName[10];int i;if(used<MaxUser){cout<<"请输入用户名:";for(i=0;c=getch();i++)if(c==13) break;elseuserName[i]=c;printf("%c",c);}userName[i]='\0';for(i=0;i<used;i++){if(!strcmp(userTable[i].userName,userName)){cout<<"\n";cout<<"该用户名已存在,创建用户失败\n";//system("pause");return;}}strcpy(userTable[used].userName,userName);cout<<"\n";cout<<"请输入密码:";for(i=0;c=getch();i++){if(c==13) break;elseuserTable[used].password[i]=c;printf("*");}userTable[used].password[i]='\0';cout<<"\n";cout<<"创建用户成功\n";used++;//system("pause");}else{cout<<"创建用户失败,用户已达到上限\n";//system("pause");}fflush(stdin);}//登录int login(){char name[10],psw[10];int i,times;cout<<"请输入用户名:";for(i=0;c=getch();i++){if(c==13) break;elsename[i]=c;printf("%c",c);}name[i]='\0';for(i=0;i<used;i++){if(!strcmp(userTable[i].userName,name))break;}if(i==used){cout<<"\n您输入的用户名不存在\n";//system("pause");return -1;}for(times=0;times<3;times++){memset(psw,'\0',sizeof(psw));cout<<"\n请输入密码:";for(i=0;c=getch();i++){if(c==13) break;elsepsw[i]=c;cout<<"*";}printf("\n");for(i=0;i<used;i++){if(!strcmp(psw,userTable[i].password)){printf("用户登录成功\n");//system("pause");break;}if(i==used){printf("您输入的密码错误,您还有%d次输入机会\n",2-times);if(times==2) exit(0);}else break;}return i;}//磁盘初始化void initDisk(){diskHead=(diskNode *)malloc(sizeof(diskNode));diskHead->maxlength=MaxDisk;diskHead->useFlag=0;diskHead->start=0;diskHead->next=NULL;}//分配磁盘int requestDist(int &startPostion,int maxLength){int flag=0; //标记是否分配成功diskNode *p,*q,*temp;p=diskHead;while(p){if(p->useFlag==0) //磁盘块未被使用,且剩余长度大于要创建文件的长度{startPostion=p->start;q=(diskNode *)malloc(sizeof(diskNode));q->start=p->start;q->maxlength=maxLength;q->useFlag=1;q->next=NULL;diskHead->start=p->start+maxLength;//剩余磁盘空间头指针后移diskHead->maxlength=p->maxlength-maxLength; //剩余磁盘空间长度减少flag=1;temp=p;if(diskHead->next==NULL) diskHead->next=q;else{while(temp->next) temp=temp->next;temp->next=q;}break;}p=p->next;}return flag;}//创建文件void createFile(char fileName[],int length){//int i,j;time_t rawtime;int startPos;UFD *fileNode,*p;for(p=userTable[userID].user->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName)){printf("文件重名,创建文件失败\n");//system("pause");return;}}if(requestDist(startPos,length)){fileNode=(UFD *)malloc(sizeof(UFD));fileNode->file=(fileTable *)malloc(sizeof(fileTable)); //这一步必不可少,因为fileNode里面的指针也需要申请地址,否则fileNode->file指向会出错strcpy(fileNode->file->fileName,fileName);fileNode->file->maxlength=length;fileNode->file->strat=startPos;fileNode->file->openFlag=false;time(&rawtime);//读取系统当前时间fileNode->file->timeinfo=localtime(&rawtime);fileNode->next=NULL;if(userTable[userID].user->next==NULL)//用户当前还没有创建文件时userTable[userID].user->next=fileNode;else //已创建过文件,找到最后一个的next 指针{p=userTable[userID].user->next;while(p->next) p=p->next;p->next=fileNode;}printf("创建文件成功\n");//system("pause");}else{printf("磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\n");//system("pause");}}//释放磁盘void freeDisk(int startPostion){diskNode *p;for(p=diskHead;p!=NULL;p=p->next){if(p->start==startPostion) //找到startPostion位置的指针break;}p->useFlag=false;}//查看文件void fileCat(char fileName[]){int startPos,length;int k=0;UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){startPos=p->file->strat;length=p->file->length;p->file->openFlag=true; //文件打开标记printf("--------------------------------------------------------------\n");for(int i=startPos;k<length;i++,k++){if(i%50==0) printf("\n"); //一行大于50个字符换行printf("%c",disk[i]);}printf("\n\n----------------------------------------------------------\n");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}//覆盖写入void fileWrite(char fileName[]){UFD *p,*q;q=userTable[userID].user;int i,k,startPos;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){if(!strcmp(p->file->fileKind,"r")) //判断文件类型{printf("该文件是只读文件,写入失败\n");//system("pause");return;}char str[500];printf("please input content:\n");gets(str);startPos=p->file->strat;p->file->openFlag=true; //文件打开标记p->file->length=strlen(str);if(p->file->length>p->file->maxlength)printf("写入字符串长度大于该文件的总长度,写入失败\n");//system("pause");return;}for(i=startPos,k=0;k<(int)strlen(str);i++,k++)disk[i]=str[k];printf("文件写入成功\n");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");// system("pause");}if(p){p->file->openFlag=false;printf("%s文件已关闭\n",p->file->fileName);// system("pause");}}//重命名void fileRen(char fileName[],char name[]){UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){while(q->next){if(!strcmp(q->next->file->fileName,name)){printf("您输入的文件名已存在,重命名失败\n");//system("pause");return;}q=q->next;strcpy(p->file->fileName,name);printf("重命名成功\n");//system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}//关闭文件void fileClose(char fileName[]){UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){p->file->openFlag=false;printf("%s文件已关闭\n",p->file->fileName);//system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}//查看文件详细信息void fileLength(char fileName[]){int startPos,length;// char kind[3];int k=0;UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){startPos=p->file->strat;length=p->file->length;//获取文件长度printf("文件长度为%d\n ",length);//system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}//检查文件是否关闭void ifClose(char fileName[]){bool open;UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){open=p->file->openFlag;if(open==true)printf("%s文件未关闭\n",p->file->fileName);else //open=trueprintf("%s文件已关闭\n",p->file->fileName);//system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}void print(){ cout<<" create 创建文件\n";cout<<" length 查看文件长度\n";cout<<" cat 查看文件内容\n";cout<<" write 覆盖写入\n";cout<<" ren 重命名\n";cout<<" del 删除文件\n";cout<<" close 关闭文件\n";cout<<" return 退出用户,返回登录界面\n";cout<<" exit 退出程序\n";cout<<" ifclose 检查文件是否关闭\n";}//删除文件void delFile(char fileName[]){UFD *p,*q,*temp;q=userTable[userID].user;p=q->next;while(p){if(!strcmp(p->file->fileName,fileName)) break;//文件不存在else{p=p->next;q=q->next;}}if(p){if(p->file->openFlag!=true) //先判断是否有进程打开该文件,如果文件没被打开{temp=p;q->next=p->next;freeDisk(temp->file->strat); //磁盘空间回收free(temp);printf("文件删除成功\n");//system("pause");else{printf("该文件已被进程打开,删除失败\n");//文件被打开//system("pause");}}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//文件不存在//system("pause");}}int main(){char order[commandAmount][10];strcpy(order[0],"create");strcpy(order[1],"cat");strcpy(order[2],"write");strcpy(order[3],"ren");strcpy(order[4],"del");strcpy(order[5],"close");strcpy(order[6],"return");strcpy(order[7],"exit");strcpy(order[8],"awrite");strcpy(order[9],"length");strcpy(order[10],"ifclose");charcommand[50],command_str1[10],command_str2[10],command_str3[5];//,command_str4[3];int i,j,k;int length;initDisk(); //初始化磁盘for(i=0;i<MaxUser;i++) //初始化用户UFD目录文件的头指针{userTable[i].user=(UFD *)malloc(sizeof(UFD));userTable[i].user->next=NULL;}cout<<"----------------------------------------------------------\n";cout<<"请先进入用户管理\n\n";cout<<" Creat user 创建新用户请输入1\n";cout<<" login 用户登录请输入2\n";cout<<"----------------------------------------------------------\n\n";while(1){cout<<"Please choose the function key:>";int choice;scanf("%d",&choice);if(choice==1) userCreate();else if(choice==2){userID=login();print();}else printf("您的输入有误,请重新选择\n");while (userID!=-1){fflush(stdin);cout<<"please input your command:>";gets(command);int select;for(i=0;command[i]!=' '&&command[i]!='\0';i++) //command_str1字符串存储命令的操作类型command_str1[i]=command[i];k=i;command_str1[k]='\0';for(i=0;i<commandAmount;i++){if(!strcmp(command_str1,order[i])){select=i;break;}}if(i==commandAmount){cout<<"您输入的命令有误,请重新输入\n";continue;}for(i=k+1,k=0;command[i]!=' '&&command[i]!='\0';i++,k++) //commmand_str2字符串存储文件名或用户名command_str2[k]=command[i];command_str2[k]='\0';k=i;switch(select){case 0:for(i=k+1,k=0;command[i]!=' '&&command[i]!='\0';i++,k++)command_str3[k]=command[i];command_str3[k]='\0';j=1;length=0; //初始化文件长度for(i=strlen(command_str3)-1;i>=0;i--) //把字符串转换为十进制{length+=(command_str3[i]-48)*j;j*=10;}createFile(command_str2,length);break;case 1:fileCat(command_str2);break;case 2:fileWrite(command_str2);break;case 4:delFile(command_str2);break;case 5:fileClose(command_str2);break;case 6:UFD *p;for(p=userTable[userID].user->next;p!=NULL;p=p->next) //退出用户之前关闭所有打的文件if(p->file->openFlag)p->file->openFlag=false;system("cls");userID=-1;break;case 7:exit(0);break;case 8:fileLength(command_str2);break;}}}return 0;}五打印的程序运行时初值和运行结果1、初值2、运行过程与结果六、心得体会通过这次的操作系统的课程设计,在老师的细心指导和同学的积极讨论下,终于做出了模拟Linux二级文件系统,能够简单得实现目录的创建和删除,文件的建立和删除,文件的读写等这些基本操作,并且着重改编了拷贝、剪切和查询的功能,了解二级目录的有关内容,并且通过编写的模拟Lunix下的操作环境有了更进一步的了解。