文件系统实验_1成都信息工程学院徐虹第8章文件系统实验•8.1实验目的•8.2准备知识•8.2.1外存管理图8-1文件系统的层次结构文件系统实验_2成都信息工程学院徐虹•8.2.2目录管理•图8-2两级目录结构文件系统实验_3成都信息工程学院徐虹•8.2.3文件系统的接口•8.2.4Linux的EXT2文件系统•图8-3EXT2文件系统的结构文件系统实验_4成都信息工程学院徐虹•8.2.5可能用到的编程技术•FILE*fopen(constchar*filename,constchar*mode)•size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);•size_tfread(void*buffer,size_tsize,size_tcount,FILE*stream);•intfseek(FILE*stream,longoffset,intorigin);文件系统实验_5成都信息工程学院徐虹•8.2.6用内存模拟外存•...•fd=fopen(filesystem,w+b);//fd是FILE指针类型,w便是•//写方式,b表示二进制•fseek(fd,specific_area,SEEK_SET);//fd是文件指针;specific_area为整型•//数,为需要写入pInode的位置•fwrite(pInode,1,sizeof(inode),fd);//写入pInode信息•...文件系统实验_6成都信息工程学院徐虹•8.3实验内容•8.4实验指导•8.4.1文件系统的数据结构•structinode{•structinode*i_forw;•structinode*i_back;•chari_flag;•unsignedinti_ino;•unsignedinti_count;•unsignedintdi_addr[NADDR];•unsignedshortdi_number;•unsignedshortdi_mode;•unsignedshortdi_uid;•unsignedshortdi_gid;•unsignedshortdi_size;•};文件系统实验_7成都信息工程学院徐虹•structfilsys{•unsignedshorts_isize;•unsignedlongs_fsize;••unsignedints_nfree;•unsignedshorts_pfree;•unsignedints_free[NICFREE];•unsignedints_ninode;•unsignedshorts_pinode;•unsignedints_inode[NICINOD];•unsignedints_rinode;•chars_fmod;•};文件系统实验_8成都信息工程学院徐虹•structuser{•unsignedshortu_default_mode;•unsignedshortu_uid;•unsignedshortu_gid;•unsignedshortu_ofile[NOFILE];•};•structpwd{•unsignedshortp_uid;•unsignedshortp_gid;•charpassword[PWDSIZ];•};文件系统实验_9成都信息工程学院徐虹•structdinode{•unsignedshortdi_number;•unsignedshortdi_mode;•unsignedshortdi_uid;•unsignedshortdi_gid;•unsignedlongdi_size;•unsignedintdi_addr[NADDR];•};•structdirect{•chard_name[DIRSIZ];•unsignedintd_ino;•};•structdir{•structdirectdirect[DIRNUM];•intsize;•};文件系统实验_10成都信息工程学院徐虹8.4.2程序设计思想图8-4main函数流程文件系统实验_11成都信息工程学院徐虹•#includemalloc.h•#includestdio.h•#includestdlib.h•#includestring.h•#includestructure.h•#includecreat.h•#includeaccess.h•#includeballfre.h•#includeclose.h•#includedelete.h•#includedir.h•#includeformat.h•#includehalt.h•#includeiallfre.h•#includeinstall.h•#includelog.h•#includename.h•#includeopen.h•#includerdwt.h•#includeigetput.h文件系统实验_12成都信息工程学院徐虹•structhinodehinode[NHINO];•structdirdir;•structfilesys_ofile[SYSOPENFILE];•structfilsysfilsys;•structpwdpwd[PWDNUM];•structuseruser[USERNUM];•FILE*fd;•structinode*cur_path_inode;•intuser_id;•unsignedshortusr_id;•charusr_p[12];•charsel;•chartemp_dir[12];文件系统实验_13成都信息工程学院徐虹•main()•{•unsignedshortab_fd1,ab_fd2,ab_fd3,ab_fd4,i,j;•char*buf;•intdone=1;••printf(\nDoyouwanttoformatthedisk(yorn)?\n);•if(getchar()=='y')•{printf(\nFormatwilleraseallcontextonthedisk\n);•printf(Formating...\n);•format();•printf(\nNowwillinstallthefillsystem,pleasewait...\n);•install();•printf(\n----Login----\nPleaseinputyouruserid:);•scanf(%u,&usr_id);•printf(\nPleaseinputyourpassword:);•scanf(%s,&usr_p);•if(!login(usr_id,usr_p))•return;文件系统实验_14成都信息工程学院徐虹•while(done){•printf(\nPleaseSelectYourOperating\n);•printf(-1----ls\n-2----mkdir\n-3----changedir\n-4----create•file\n-0----Logout\n);•sel=getche();•switch(sel)•{•case'1':/*显示目录内容*/•_dir();•break;•case'2':/*创建目录*/•printf(Pleaseinputdirname:);•scanf(%s,temp_dir);•mkdir(temp_dir);•break;•case'3':/*改变当前目录*/•printf(Pleaseinputdirname:);•scanf(%s,temp_dir);•chdir(temp_dir);•break;文件系统实验_15成都信息工程学院徐虹case'4':/*创建文件*/printf(Pleaseinputfilename:);scanf(%s,temp_dir);ab_fd1=creat(2118,temp_dir,01777);buf=(char*)malloc(BLOCKSIZ*6+5);write(ab_fd1,buf,BLOCKSIZ*6+5);close(0,ab_fd1);free(buf);break;case'0':/*退出文件系统*/logout(usr_id);halt();done=0;default:printf(Error!\nNosuchcommand,pleasetryagain.\nOryoucanaskyourteacherforhelp.\n);break;}}}elseprintf(Usercanseled\nGoodBye\n);}文件系统实验_16成都信息工程学院徐虹表8-1实验设计的文件系统与真正文件系统的区别实验设计的文件系统真正文件系统二进制格式自定义系统文件格式依赖其他操作系统不依赖于其他操作系统调用库函数访问外存调用中断访问外存文件系统实验_17成都信息工程学院徐虹图8-5数据地址安排文件系统实验_18成都信息工程学院徐虹8.4.3几个重要的算法处理图8-7数据块的分配文件系统实验_19成都信息工程学院徐虹for(i=NICFREE+2;iFILEBLK;i+=50)/*要加上2的原因是:每50个BLOCK成组,在每个BLOCK组当中的第一个BLOCK(称为地址块)放有整个BLOCK组的地址。这样,filsys.s_free[0]指向该组的地址块,而filsys.s_free[49]+1则指向下一个组的地址块*/{for(j=0;jNICFREE;j++){block_buf[NICFREE-1-j]=i-j;}fseek(fd,DATASTART+BLOCKSIZ*(i-49),SEEK_SET);fwrite(block_buf,1,BLOCKSIZ,fd);}//当i=502之后,完成文件块502~453的写入;之后文件块512~503不能进行,需要特殊处理for(i=503;i512;i++)block_buf[i-503]=i;fseek(fd,DATASTART+BLOCKSIZ*503,SEEK_SET);fwrite(block_buf,1,BLOCKSIZ,fd);//至此,才完成512块文件块的定位for(i=0;iNICFREE;i++){filsys.s_free[i]=i+3;//从DATASTART的第一个BLOCK作为MAIN//DIRECTORY//第二个BLOCK作为etc目录//第三个BLOCK作为password文件//故此i要加3}文件系统实验_20成都信息工程学院徐虹图8-8数据块的回收文件系统实验_21成都信息工程学院徐虹if(filsys.s_nfree==0){printf(\nDiskFull!!\n);returnDISKFULL;}i=filsys.s_pfree;flag=(i==0);if(flag)//该BLOCK组全部用了{fseek(fd,DATASTART+BLOCKSIZ*(filsys.s_free[NICFREE-1]+1),SEEK_SET);//filsys.s_free[NICFREE-1]+1指向下一个block组的地址块fread(block_buf,1,BLOCKSIZ,fd);for(i=0;iNICFREE;i++){filsys.s_free[i]=block_buf[i];}//将待用block组的地址读入超级块filsys.s_pfree=NICFREE-1;free_block=filsys.s_free[filsys.s_pfree];}else{free_block=filsys.s_free[filsys.s_pfree];filsys.s_pfree--;}文件系统实验_22成都信息工程学院徐虹图8-9访问控制文件系统实验_23成都信息工程学院徐虹•if(filsys.s_pfree==NICFREE-1)•//表示回收的block已经可以组成一个