实验5 Linux文件管理.docx
- 文档编号:6513600
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:44
- 大小:84.38KB
实验5 Linux文件管理.docx
《实验5 Linux文件管理.docx》由会员分享,可在线阅读,更多相关《实验5 Linux文件管理.docx(44页珍藏版)》请在冰豆网上搜索。
实验5Linux文件管理
实验5Linux文件管理
一、实验目的
1.掌握Linux文件系统的基本原理、结构和实现方法
2。
掌握Linux文件系统中文件的建立、打开、读/写、执行、属性等系统调用的使用
3.学会设计简单的文件系统并实现一组操作
4.通过实验学习文件系统的系统调用命令,提高对文件系统实现功能的理解和掌握
二、实验内容
设计并实现一个一级文件系统程序,要求实现以下功能:
1。
提供文件创建/删除接口命令create/delete、目录创建/删除接口命令mkdir/rmdir、显示目录内容命令ls等。
2.创建的文件不要求格式和内容。
三、实验结果
1。
程序源代码
main。
cpp
#include〈stdio。
h>
#include h〉 #include h〉 #include〈string.h> #include"structure。 h” #include"creat.h" #include”access.h" #include”ballfre.h" #include"close。 h” #include"delete.h” #include"dir.h” #include”format.h” #include”halt.h" #include"iallfre.h” #include”install.h” #include"log。 h" #include"name。 h" #include"open。 h” #include"rdwt.h" #include”igetput.h” structhinodehinode[NHINO]; structdirdir; structfilesys_ofile[SYSOPENFILE]; structfilsysfilsys; structpwdpwd[PWDNUM]; structuseruser[USERNUM]; FILE*fd; structinode*cur_path_inode; intuser_id; /*kkkkk*/ unsignedshortusr_id; charusr_p[12]; charsel; chartemp_dir[12]; 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); /*printf("\nsuccess\n”);*/ if(! login(usr_id,usr_p)) return; while(done) { printf("\nPleaseSelectYourOperating\n"); printf("—1-—--ls\n-2——--mkdir\n—3----changedir\n-4—-——createfile\n—0——-—Logout\n”);/*зЂвт*/ sel=getchar(); sel=getchar(); 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; 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; } } } else printf("Usercanseled\nGoodBye\n”); } structure。 h #ifndef_STRUCTURE_H #define_STRUCTURE_H #defineMAX32767 #defineBLOCKSIZ512 #defineSYSOPENFILE40 #defineDIRNUM128 #defineDIRSIZ14 #definePWDSIZ12 #definePWDNUM32 #defineNOFILE20 #defineNADDR10 #defineNHINO128 #defineUSERNUM10 #defineDINODESIZ72 #defineDINODEBLK32 #defineFILEBLK512 #defineNICFREE50 #defineNICINOD50 #defineDINODESTART1024 #defineDATASTART(2+DINODEBLK)*BLOCKSIZ #defineDIEMPTY00000 #defineDIFILE01000 #defineDIDIR02000 #defineUDIREAD00001 #defineUDIWRITE00002 #defineUDIEXICUTE00004 #defineGDIREAD00010 #defineGDIWRITE00020 #defineGDIEXICUTE00040 #defineODIREAD00100 #defineODIWRITE00200 #defineODIEXICUTE00400 #defineREAD1 #defineWRITE2 #defineEXICUTE3 #defineDEFAULTMODE00777 #defineIUPDATE00002 #defineSUPDATE00001 #defineFREAD00001 #defineFWRITE00002 #defineFAPPEND00004 #defineDISKFULL65535 #defineSEEK_SET0 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; }; structdinode { unsignedshortdi_number; unsignedshortdi_mode; unsignedshortdi_uid; unsignedshortdi_gid; unsignedlongdi_size; unsignedintdi_addr[NADDR]; }; structdirect { chard_name[DIRSIZ]; unsignedintd_ino; }; structfilsys { unsignedshorts_isize; unsignedlongs_fsize; unsignedints_nfree; unsignedshorts_pfree; unsignedints_free[NICFREE]; unsignedints_ninode; unsignedshorts_pinode; unsignedints_inode[NICINOD]; unsignedints_rinode; chars_fmod; }; structpwd { unsignedshortp_uid; unsignedshortp_gid; charpassword[PWDSIZ]; }; structdir { structdirectdirect[DIRNUM]; intsize; }; structhinode { structinode*i_forw; }; structfile { charf_flag; unsignedintf_count; structinode*f_inode; unsignedlongf_off; }; structuser { unsignedshortu_default_mode; unsignedshortu_uid; unsignedshortu_gid; unsignedshortu_ofile[NOFILE]; }; externstructinode*aaa; externstructhinodehinode[NHINO]; externstructdirdir; externstructfilesys_ofile[SYSOPENFILE]; externstructfilsysfilsys; externstructpwdpwd[PWDNUM]; externstructuseruser[USERNUM]; externstructinode*cur_path_inode; externFILE*fd; externintuser_id; externstructinode*iget(); externiput(); externunsignedintballoc(); externbfree(); externstructinode*ialloc(); externifree(); externintnamei(); externshortiname(); externunsignedintaccess(); extern_dir(); externmkdir(); externchdir(); externunsignedshortopen(); externcreate(); externunsignedintread(); externunsignedintwrite(); externintlogin(); externlogout(); externinstall(); externformat(); externclose(); externhalt(); #endif access。 h #include〈stdio。 h〉 #include"structure。 h" unsignedintaccess(user_id,inode,mode) unsignedintuser_id; structinode*inode; unsignedshortmode; { switch(mode) { caseREAD: if(inode->di_mode&ODIREAD)return1; if((inode—〉di_mode&GDIREAD)&& (user[user_id]。 u_gid==inode->di_gid))return1; if((inode->di_mode&UDIREAD)&& (user[user_id]。 u_uid==inode—〉di_uid))return1; return0; caseWRITE: if(inode—>di_mode&ODIWRITE)return1; if((inode—>di_mode&GDIWRITE)&& (user[user_id]。 u_gid==inode->di_gid))return1; if((inode->di_mode&UDIWRITE)&& (user[user_id].u_uid==inode->di_uid))return1; return0; caseEXICUTE: if(inode—〉di_mode&ODIEXICUTE)return1; if((inode—>di_mode&GDIEXICUTE)&& (user[user_id].u_gid==inode—>di_gid))return1; if((inode—>di_mode&UDIEXICUTE)&& (user[user_id]。 u_uid==inode—〉di_uid))return1; return0; default: return1; } } ballfre。 h #include〈stdio。 h> #include"structure。 h" staticunsignedintblock_buf[BLOCKSIZ/sizeof(int)]; unsignedintballoc() { unsignedintfree_block; inti,flag; 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;i〈NICFREE;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-—; } filsys.s_nfree——; filsys。 s_fmod=SUPDATE; returnfree_block; } bfree(unsignedintblock_num) { inti; if(filsys.s_pfree==NICFREE-1) //表示回收的block已经可以组成一个block组了 { for(i=0;i { block_buf[i]=filsys。 s_free[NICFREE—1-i]; } filsys。 s_pfree=0; fseek(fd,DATASTART+BLOCKSIZ*(filsys。 s_free[0]),SEEK_SET); //filsys.s_free[0]为当前BLOCK组的地址块 fwrite(block_buf,1,BLOCKSIZ,fd); } elsefilsys.s_pfree++; filsys。 s_nfree++; filsys。 s_fmod=SUPDATE; } close.h #include #include"structure.h” close(user_id,cfd) unsignedintuser_id; unsignedshortcfd; { structinode*inode; inode=sys_ofile[user[user_id]。 u_ofile[cfd]]。 f_inode; iput(inode); sys_ofile[user[user_id].u_ofile[cfd]]。 f_count--; user[user_id]。 u_ofile[cfd]=SYSOPENFILE+1; } creat。 h creat(uid,filename,mode) unsignedintuid; char*filename; unsignedshortmode; { intdi_ith,di_ino; structinode*inode; inti,j; i=0; while(i〈USERNUM)//user[]的值由函数login()注册,参看文件log.h { if(user[i]。 u_uid==uid) { user_id=i; break; } i++; } if(i==USERNUM) { printf(”theuseridiswrong.\n"); exit (1); } di_ino=namei(filename); if(di_ino! =-1)//文件已经存在 { inode=iget(di_ino); if(access(user_id,inode,mode)==0) { iput(inode); printf(”\ncreataccessnotallowed\n”); return0; } for(i=0;i { bfree(inode->di_addr[i]); } for(i=0;i if(sys_ofile[i].f_inode==inode) { sys_ofile[i]。 f_off=0; } for(i=0;i if(user[user_id]。 u_ofile[i]==SYSOPENFILE+1) { user[user_id].u_uid=inode—〉di_uid; user[user_id].u_gid=inode->di_gid; for(j=0;j〈SYSOPENFILE;i++) if(sys_ofile[j]。 f_count==0) { user[user_id]。 u_ofile[i]=j; sys_ofile[j].f_flag=(char)mode; } returni; } } else { inode=ialloc(); di_ith=iname(filename); dir。 size++; dir.direct[di_ith]。 d_ino=inode—〉i_ino; inode-〉di_mode=user[user_id]。 u_default_mode; inode->di_uid=user[user_id]。 u_uid; inode->di_gid=user[user_id].u_gid; inode-〉di_size=0; inode->di_number=0; for(i=0;i〈SYSOPENFILE;i++) if(sys_ofile[i].f_count==0) { break; } for(j=0;j if(user[user_id].u_ofile[j]==SYSOPENFILE+1) { break; } user[user_id]。 u_ofile[j]=i; sys_ofile[i]。 f_flag=(char)mode; sys_ofile[i]。 f_count=0; sys_ofile[i].f_off=0; sys_ofile[i]。 f_inode=inode; returnj; } return0; } delete。 h #include〈stdio。 h〉 #include”structure。 h” delete(char*filename) { unsignedintdinodeid; structinode*inode; dinodeid=namei(filename); if(dinodeid! =(int)NULL) inode=iget(dinodeid); inode—>di_number—-; iput(inode); } dir。 h _dir() { unsignedintdi_mode; inti,j,one; structinode*temp_inode; printf("CURRENTDIRECTORY: \n”); for(i=0;i { if(di
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验5 Linux文件管理 实验 Linux 文件 管理
![提示](https://static.bdocx.com/images/bang_tan.gif)