模拟Unix文件系统实验报告_第1页
模拟Unix文件系统实验报告_第2页
模拟Unix文件系统实验报告_第3页
模拟Unix文件系统实验报告_第4页
模拟Unix文件系统实验报告_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2014-2015(1)操作系统原理课程大型实验模拟Unix文件系统

目录模拟Unix文件系统 0一. 实验介绍 2〔1〕 文件卷结构设计 2〔2〕 I节点结构设计 2〔3〕 目录结构 2〔4〕 用户及组结构 2二. 实验环境 2三. 实验设计 33.1系统流程 43.2文件结构 53.3实现命令操作 5四.数据结构 64.1超级块 64.2I节点 64.3目录 74.4用户文件表 74.5用户和组 7五.模块详解 85.1文件、目录和文件表操作 85.2i节点操作 85.3块操作 85.4具体命令操作 95.5主函数和所有命令操作的函数 95.6其他函数 9六.实验演示 96.1登录 96.2cat操作 96.3cd操作 106.4ls操作 106.5chgrp操作 106.6chown操作 106.7chmod操作 106.8touch操作 106.9mkdir操作 106.10rmdir操作 116.11rm操作 116.12ln操作 116.13mv操作 116.14cp操作 116.15passwd操作 116.16pwd操作 126.17umask操作 12七.实验总结 12实验介绍文件卷结构设计ii节点区数据区管理区0#1#…K#K+1#K+2#K+3#…n#K=12,n=2048I节点结构设计文件大小文件联接计数文件地址文件拥有者文件所属组文件权限及类别文件最后修改时间其中文件地址为六项:四个直接块号,一个一次间址,一个两次间址目录结构用16字节表示,其中14字节为文件名,2字节为I节点号用户及组结构用户信息中包括用户名、口令,所属组,用户翻开文件表〔文件树结构应与用户相对应:有每个用户的HOME目录〕组信息中可只包含组名,组号。实验环境Linux操作系统,标准c89实验设计3.1系统流程开始开始输出输出登录选1,初始化选2输入输入一个整型ii>0?i>0?NYi==2?i==2?N结束结束Y初始化程序初始化程序i==1?i==1?NY进入登录程序进入登录程序是否是否退出?登录登录成功?NNY结束进入命令操作程序Y结束进入命令操作程序结束结束3.2文件结构1.根本思路:用硬盘上的一个文件〔funix.txt〕来模拟一个文件卷。2.磁盘块的设计:每块512个字节,一共2048块,数据区占用2035块,I节点占用12块,每个i节点占48个字节,一共128个i节点,超级块占第0块。3.空闲磁盘块:采用成组链接法管理。每组10块,格式化时假设所有块都分配了出去,将所有块按从大到小的顺序依次压入。4.I结点管理:采用位示图法,注意此时位示图不表示空闲块,只表示相应的i节点号是否被利用,如果被利用相应的i节点号对应位示图的那一位为1,如果没有被利用那么对应的位为0。3.3实现命令操作命令格式ls显示文件目录chmod改变文件权限chown改变文件拥有者chgrp改变文件所属组pwd显示当前目录cd改变当前目录mkdir创立子目录rmdir删除子目录umask文件创立屏蔽码mv改变文件名cp文件拷贝rm文件或目录删除ln建立文件联接cat连接显示文件内容passwd修改用户口令touch创立文件vi编写文件内容四.数据结构4.1超级块#ifndefSUPER structsuper{ unsignedintcsize;//文件系统的总块数(4) unsignedshortbsize;//每块的字节数(2) unsignedintdsize;//数据块的块数(4) unsignedintdbeg;//数据块的起始块号(4) unsignedintdemp;//空闲盘块数(4) unsignedshortisize;//i节点块的总块数(2) unsignedintibeg;//i节点的起始块号(4) unsignedshortinum;//i节点的个数(2) unsignedshorti[8];//i节点位示图(12) unsignedshorticlock;//inode锁(2) unsignedintmfsize;//文件的最大所占字节数(4) unsignedshortbmf;//文件的最大所占块数(2) time_tbu;//修改时间(8) shortdssize;//当前空闲盘块好栈中的空闲盘块数目(2) unsignedintdss[DS_size];//(400) unsignedshortdsclock;//成组链接锁(2) }sup;#endif4.2I节点//外存i节点#ifndefINODEstructinode{ unsignedintfsize;//文件大小(4) unsignedshortfln;//文件连接数(2) chargid;//文件所属组id(1) charuid;//文件拥有者id(1) intfmode;//文件的类型和权限(4) time_titime;//文件最后修改时间(8) unsignedintaddr[6];//文件地址(24)};#endif//内存i节点#ifndefMINODEstructminode{ intiid;//i节点号 structinodein;//读入内存的外存i节点/ charchflg;//是否被修改 unsignedshortmico;//〔未用到〕进程连接的个数};#endif4.3目录//目录#ifndefLISTstructlist{ charls_name[14]://文件或目录名; unsignedshortib;//对应的i节点号/};#endif4.4用户文件表#ifndefLS_MINODEstructls_minode{ unsignedintf_offest://文件相对起始位置的偏移; intf_flag://文件的存取权限; unsignedshortf_count://翻开这个文件的操作的个数; structminode*mi://内存i节点;}f_inode[50];#endif4.5用户和组外存用户信息#ifndefUSERstructuser{ charusername[14];//用户名 charuid;//用户id chargrpname[14];//组名 chargid;//组id intumask;//屏蔽码 charpassword[20];//密码 charhomedir[50];//家目录};#endif//内存用户信息#ifndefMUSERstructmuser{ structuserus://读入内存的外存用户信息; intoff_t://用户信息在外存etc文件中的位置; intfd;//当前目录在文件表中的位置:}mus;#endif五.模块详解5.1文件、目录和文件表操作(经过i节点模块封装后这一层的所有操作都感觉是对文件中的每一个字节进行操作)intsearch(char*,int);//查找单个目录下文件或子目录的函数intiname(char*);//从根目录查找整个目录函数intreadf(intfd,char*buf,intcount);//读文件中的内容dintwritef(intfd,constchar*buf,intcount);//将内容写入文件eintopenf(constchar*pathname,intflags);//查找目录找到文件后写入文件表nintcreatf(constchar*pathname,intmode);//创立文件或目录tintlinkf(constchar*oldpath,constchar*newpath);//联接文件kintunlinkf(constchar*pathname);//删除联接kintclosef(intfd);//关闭文件e5.2i节点操作〔1、主要负责将所有上层对字节的操作转化为对块的操作2、文件的底层建立和删除〕intiread(inti,structinode*);读入外存inode;intiwrite(inti,structinode*);写出外存inode;intialloc(structiuserius);申请inode;intifree(inti);释放inode;structminode*i_get(inti);//获取内存inodeinti_put(structminode*);//删除内存inode;intgetblock(unsignedintoffset,structinode);//寻找文件物理块函数intifadd(unsignedintsize,structminode*);//将文件的字节的加长转化为对物理块的增加了intifsub(unsignedintsize,structminode*);//文件的减短改变为对物理块的减少intsubblock(unsignedintoffset,structinodein);//删除文件块子函数5.3块操作unsignedintballoc();//分配一个块intbrelse(unsignedintb);//回收一个块intbread(intb,unsignedshortseek,unsignedshortm,void*buf);//读取块中的内容intbwrite(intb,unsignedshortseek,unsignedshortm,constvoid*buf);//写入块中的内容intset_ds();//成组链接的初始化函数;5.4具体命令操作voidls();//显示文件目录voidcd(char*);//改变当前目录voidu_umask(int);//文件创立屏蔽码voidpasswd(constchar*);//修改用户口令voidu_chmod(char*,int);//改变文件权限voidpwd();//显示当前目录voidu_chown(char*,char);//改变文件拥有者voidu_chgrp(char*,char);//改变文件所属组voidu_touch(char*);//新建文件voidrm(char*);//文件删除voidu_mkdir(char*);//创立子目录voidu_rmdir(char*);//删除子目录voidvi(char*);//编写文件内容voidu_cat(char*);//连接显示文件内容voidu_mv(char*,char*);//改变文件名voidu_ln(char*,char*);//建立文件联接voidu_cp(char*,char*);//文件拷贝5.5主函数和所有命令操作的函数intbash(char*);//所有命令操作的函数exit退出命令操作函数;intmain(void);//主函数进行登录和格式化或进入所有命令操作的函数5.6其他函数intinit();初始化函数/intlogin();登录函数/intshutdown();/退出系统的函数/六.实验演示6.1登录6.2cat操作6.3cd操作6.4ls操作6.5chgrp操作6.6chown操作6.7chmod操作6.8touch操作6.9mkdir操作6.10rmdir操作6.11rm操作6.12ln操作6.13mv操作6.14cp操作6.15passwd操作6.16pwd操作6.17umask操作七.实验总结经过4周的共同努力,我们将程序按要求编写、修改完善,使其能实现课程设计要求的根本功能并增加了一个新的功能〔新建文件〕。操作系统是计算机科学与技术专业中的一门重要根底课,目的是让我们了解操作系统的根本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。通过课程设计,可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。操作系统课程设计,对于训练我们掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。重点培养我们的思维能力、创新能力和排错能力。通过课程设计,进一步融会贯穿教材内容,掌握程序各功能模块的工作原理,相互联系和来龙去脉,完整地建立系统的概念。激发我的学习热情和主动性,培养我的独立工作能力,在实践活动中,将所学知识综合运用,增长才干,并积累经验。对编程语言C又有了更深一层次的认识,并对其的编程能力有所加强,但还是很多的缺乏有待改良,对于编程来说还需要大量的实践,才能在发现问题和解决问题中前进与提高。最后,祝老师新年快乐,身体健康,工作顺利,万事如意!八.代码/**block.c**Createdon:2014å¹´12月27æ—¥*Author:sunb*/#include<time.h>#include"super.h"#include"block.h"#include"inode.h"#include<unistd.h>intbread(intb,unsignedshortseek,unsignedshortm,void*buf){// off_tls=(b-1)*B_size+D_beg*B_size+seek; size_tco=m; intl=pread(fd,buf,co,ls); returnl;}intbwrite(intb,unsignedshortseek,unsignedshortm,constvoid*buf){ // off_tls=(b-1)*B_size+D_beg*B_size+seek; size_tco=m; intl=pwrite(fd,buf,co,ls); returnl;}unsignedintballoc(){ unsignedintblock=0; if(sup.dssize+1>0){ block=sup.dss[sup.dssize]; sup.dssize--; sup.demp--; } if(sup.dss[0]!=0&&sup.dssize+1==0){ block=sup.dss[0]; bread(block,0,DS_size*4,&(sup.dss)); sup.dssize=DS_size-1; sup.demp--; }elseif(sup.dss[0]==0&&sup.dssize+1==0){ puts("空间已用完"); } returnblock;}intbrelse(unsignedintb){ if(b<=D_size){ if(sup.dssize<DS_size-1){ sup.dssize++; sup.dss[sup.dssize]=b; sup.demp++; returnb; } elseif(sup.dssize==DS_size-1){ bwrite(b,0,DS_size*4,&(sup.dss)); sup.dss[0]=b; sup.dssize=0; sup.demp++; returnb; } return0; } return-1;}intset_ds()//{ sup.dssize=0; sup.dss[0]=0; inti=D_size; while(i>0) { intft=brelse(i); /*printf("%d\t",ft); if(ft%30==0) puts("\n");*/ /*while(sup.dssize<DS_size&&i>0){ sup.dss[sup.dssize]=i; sup.dssize++; i--; } if(sup.dssize==DS_size){ //bwrite(intb,unsignedshortseek,unsignedshortm,constchar*buf) intf=DS_size; while(f--){ printf("%d\t",sup.dss[DS_size-f-1]); } if(i>0){ bwrite(i,0,4*DS_size,&(sup.dss)); sup.dssize=0; } } } if(sup.dssize!=0){ sup.dssize--; }*/ i--; } puts("\n"); return0;}/**block.h**Createdon:2014年12月27日*Author:sunb*/#ifndefBLOCK_H_#defineBLOCK_H_#ifndefZBLOCKstructzblock{ unsignedintdss[100];//(400)};#endifunsignedintballoc();//块分配//intiballoc(structinode*,unsignedint);intbrelse(unsignedintb);//块回收intbread(intb,unsignedshortseek,unsignedshortm,void*buf);//块读intbwrite(intb,unsignedshortseek,unsignedshortm,constvoid*buf);//块写intset_ds();#endif/*BLOCK_H_*//**file.c**Createdon:2015年1月2日*Author:sunb*/#include<time.h>#include"super.h"#include"user.h"#include"inode.h"#include"list.h"#include"block.h"#include"file.h"#include<string.h>voidgetfid(structlistls){ intil=0,ki=0,lfb=-1,lfc=-1; f_inode[lfd].f_offest=0; while(il<50){ if(f_inode[il].mi!=NULL){ if(((short)f_inode[il].mi->iid)==ls.ib) { lfb=il; break; } }elseif(ki==0){ lfc=il; ki=1; } il++; } if(lfc>=0&&lfb<0){ f_inode[lfc].mi=i_get(ls.ib); f_inode[lfc].f_flag=06; f_inode[lfc].f_offest=0; f_inode[lfc].f_count=1; lff=lfd; lfd=lfc; }elseif(lfb>=0){ f_inode[lfb].f_count=1; if((f_inode[lfb].mi->in.fmode&01000)>0){ f_inode[lfb].f_offest=0; } lff=lfd; lfd=lfb; }else{ lfb=-1; }}intl_readf(intfd,void*buf,intcount){ unsignedshortseek=(unsignedshort)f_inode[fd].f_offest%B_size; intb=0; if(f_inode[fd].f_offest<f_inode[fd].mi->in.fsize&&f_inode[fd].mi->in.fsize!=0){ b=getblock(f_inode[fd].f_offest/B_size,f_inode[fd].mi->in); unsignedshortm=(unsignedshort)count; intbd=bread(b,seek,m,buf); returnbd; } return0;}intreadf(intfd,char*buf,intcount){ if((f_inode[fd].f_flag&04)>0){ intfi=f_inode[fd].f_offest; if(f_inode[fd].f_offest+count>f_inode[fd].mi->in.fsize) { count=f_inode[fd].mi->in.fsize-f_inode[fd].f_offest; } intt=B_size-f_inode[fd].f_offest%B_size; if(t>=count){ f_inode[fd].f_offest=f_inode[fd].f_offest+l_readf(fd,buf,count); }else{ inti=0; if(t<B_size){ f_inode[fd].f_offest=f_inode[fd].f_offest+l_readf(fd,buf,t); count=count-t; i=t; } while(count>0) { if(count>B_size){ f_inode[fd].f_offest=f_inode[fd].f_offest+l_readf(fd,(buf+i),B_size); count=count-B_size; i=i+B_size; } else{ f_inode[fd].f_offest=f_inode[fd].f_offest+l_readf(fd,(buf+i),count); i=i+count; count=0; } } } fi=f_inode[fd].f_offest-fi; returnfi; } return0;}intl_writef(intfd,constvoid*buf,intcount){ unsignedshortseek=(unsignedshort)f_inode[fd].f_offest%B_size; intb=0; intbd=0; b=getblock(f_inode[fd].f_offest/B_size,f_inode[fd].mi->in); unsignedshortm=(unsignedshort)count; bd=bwrite(b,seek,m,buf); returnbd;}intwritef(intfd,constchar*buf,intcount){ if((f_inode[fd].f_flag&02)>0) { intfi=f_inode[fd].f_offest; if(f_inode[fd].f_offest+count>f_inode[fd].mi->in.fsize) { ifadd(f_inode[fd].f_offest+count-f_inode[fd].mi->in.fsize,f_inode[fd].mi); f_inode[fd].f_offest=fi; } intt=B_size-f_inode[fd].f_offest%B_size; if(t<count){ inti=0; if(t<B_size){ f_inode[fd].f_offest=f_inode[fd].f_offest+l_writef(fd,buf,t); count=count-t; i=t; } while(count>0) { if(count>B_size){ f_inode[fd].f_offest=f_inode[fd].f_offest+l_writef(fd,(buf+i),B_size); count=count-B_size; i=i+B_size; } else{ f_inode[fd].f_offest=f_inode[fd].f_offest+l_writef(fd,(buf+i),count); i=i+count; count=0; } } } else{ f_inode[fd].f_offest=f_inode[fd].f_offest+l_writef(fd,buf,count); } fi=f_inode[fd].f_offest-fi; returnfi; } return0;}intsearch(char*fname,intsi){ intj=0; if(f_inode[lfd].mi!=NULL){ structlistls; if((f_inode[lfd].mi->in.fmode&01000)>0){ f_inode[lfd].f_offest=0; while(j<f_inode[lfd].mi->in.fsize) { readf(lfd,&ls,16); if(strcmp(ls.ls_name,fname)==0) { getfid(ls); returnFOUND; } j=j+si; } } } returnNOFOUND;}intiname(char*route){ inti; char*namel=(char*)malloc(14); if(*route=='/'||*route=='\\') { lfd=0; f_inode[lfd].f_offest=0; f_inode[lfd].f_count=1; while(*route!='\0') { route++; for(i=0;i<14;i++) { if(*route=='/')break; if(*route=='\0'){ break; } if(*route=='\\')break; namel[i]=*route; route++; } namel[i]='\0'; if(0==search(namel,16))//没找到 { free(namel); return0; } } free(namel); return1; } free(namel); return0;}intl_creatf(constchar*pathname,structiuserius){ intk=0; char*namel=(char*)malloc(14); if(*pathname=='/'||*pathname=='\\') { intgs=0; lfd=0; f_inode[lfd].f_offest=0; f_inode[lfd].f_count=1; while(*pathname!='\0') { pathname++; for(k=0;k<14;k++) { if(*pathname=='/')break; if(*pathname=='\0'){ gs=1; break; } if(*pathname=='\\')break; namel[k]=*pathname; pathname++; } namel[k]='\0'; if(0==search(namel,16))//没找到 { //i_put(f_lod.mi); if(gs==1){ intf=ialloc(ius); if(f>0){ structlist*ls=(structlist*)malloc(sizeof(structlist)); ls->ib=f; strcpy(ls->ls_name,namel); f_inode[lfd].f_flag=(f_inode[lfd].f_flag|02); writef(lfd,ls,16); free(ls); free(namel); returnf; } free(namel); return-1; } free(namel); return-2; } } free(namel); return-3; } free(namel); return-4;}inttestmode(intflag,intfid){ intfig; if(f_inode[fid].mi->in.uid==mus.us.uid){ fig=f_inode[fid].mi->in.fmode>>6; fig=flag&fig&07; }elseif(f_inode[fid].mi->in.gid==mus.us.gid){ fig=f_inode[fid].mi->in.fmode>>3; fig=flag&fig&07; }else{ fig=f_inode[fid].mi->in.fmode; fig=flag&fig&07; } returnfig;}intopenf(constchar*pathname,intflags){ if(*pathname=='/'&&*(pathname+1)=='\0'){ return0; } elseif(iname(pathname)==1) { intfig=testmode(flags,lfd); if(fig>0){ f_inode[lfd].f_count=1; f_inode[lfd].f_offest=0; f_inode[lfd].f_flag=fig; returnlfd; }else{ puts("权限缺乏\n"); return-1; } } else puts("找不到文件或无法翻开\n"); return-1;}intclosef(intfd){ if(f_inode[fd].mi!=NULL){ i_put(f_inode[fd].mi); f_inode[fd].f_offest=0; f_inode[fd].mi=NULL; return0; } return-1;}intcreatf(constchar*pathname,intmode){ structiuseriu; iu.gid=mus.us.gid; iu.uid=mus.us.uid; iu.mode=(~mus.us.umask)&mode; char*fname=(char*)malloc(100); strcpy(fname,pathname); intii=l_creatf(fname,iu); if(ii>0){ intifd=openf(fname,06); free(fname); returnifd; } free(fname); returnlfd;}intunlinkf(constchar*pathname){ char*fname=(char*)malloc(100); strcpy(fname,pathname); intgfd=openf(fname,06); if(gfd>0){ f_inode[gfd].mi->in.fln--; if(f_inode[gfd].mi->in.fln==0){ ifsub(f_inode[gfd].mi->in.fsize,f_inode[gfd].mi); ifree(f_inode[gfd].mi->iid); i_put(f_inode[gfd].mi); f_inode[gfd].mi=NULL; } structlist*lis=(structlist*)malloc(sizeof(structlist)); intbo=0; f_inode[lff].f_offest=0; intjj=0; while(jj<100){ if(fname[jj]=='\0') break; jj++; } intkk=jj; while(jj--) { if(fname[jj]=='/')break; } fname[jj]='\0'; charbname[14]; intyy=0; jj++; while((kk-jj)>yy) { bname[yy]=fname[jj+yy]; yy++; } bname[yy]='\0'; while(readf(lff,lis,sizeof(structlist))) { intrd; if(bo==1) { f_inode[lff].f_offest=rd; writef(lff,lis,sizeof(structlist)); f_inode[lff].f_offest=rd+2*sizeof(structlist); } if(strcmp(lis->ls_name,bname)==0) { bo=1; } rd=f_inode[lff].f_offest-sizeof(structlist); } if(bo==1){ ifsub(sizeof(structlist),f_inode[lff].mi); f_inode[lff].f_offest=0; } free(lis); close(gfd); free(fname); return0; } free(fname); return-1;}intlinkf(constchar*oldpath,constchar*newpath){ char*fname=(char*)malloc(100); strcpy(fname,oldpath); intgfd=openf(fname,06); if(gfd>0){ char*aname=(char*)malloc(100); strcpy(aname,newpath); if(iname(aname)==0){ intjj=0; while(jj<100){ if(aname[jj]=='\0') break; jj++; } intkk=jj; while(jj--){ if(aname[jj]=='/')break; } aname[jj]='\0'; charbname[14]; intyy=0; jj++; while((kk-jj)>yy){ bname[yy]=aname[jj+yy]; yy++; } bname[yy]='\0'; intdff=openf(aname,06); structlist*ls=(structlist*)malloc(sizeof(structlist)); ls->ib=f_inode[gfd].mi->iid; f_inode[gfd].mi->in.fln++; strcpy(ls->ls_name,bname); f_inode[dff].f_offest=f_inode[dff].mi->in.fsize; writef(dff,ls,16); free(ls); free(fname); free(aname); return0; }else{ printf("文件以存在\n"); free(aname); } } free(fname); return-1;}/**file.h**Createdon:2015年1月2日*Author:sunb*/#ifndefFILE_H_#defineFILE_H_#defineFOUND1//找到目录#defineNOFOUND0//没找到#defineLG1//新建#defineNOLG0//查找//目录intlfd;intlff;inttestmode(int,int);//测试是否可以对文件进行操作voidgetfid(structlist);intl_readf(intfd,void*buf,intcount);//读取转化函数intl_writef(intfd,constvoid*buf,intcount);//写入转化函数intsearch(char*,int);//查找目录函数intiname(char*);//查找整个目录函数intl_creatf(constchar*pathname,structiuserius);//创立文件/*模拟系统程序接口*/intopenf(constchar*pathname,intflags);//openintreadf(intfd,char*buf,intcount);//readintwritef(intfd,constchar*buf,intcount);//writeintcreatf(constchar*pathname,intmode);//creatintlinkf(constchar*oldpath,constchar*newpath);//linkintunlinkf(constchar*pathname);//unlinkintclosef(intfd);//close#endif/*FILE_H_*//*============================================================================Name:funix.cAuthor:sunboVersion:Copyright:YourcopyrightnoticeDescription:HelloWorldinC,Ansi-style============================================================================*/#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<stdlib.h>#include"super.h"#include"user.h"#include"inode.h"#include"list.h"#include"block.h"#include"file.h"#include"init.h"intbash(char*);intmain(void){ fd=open("funix.txt",O_RDWR); openf("/",06); inti=0; while(i>=0){ puts("初始化输入2、登陆输入1"); scanf("%d",&i); if(i==2){ init(); }elseif(i==1){ if(login()==0){ close(fd); return0; } else{ char*shell=(char*)malloc(12); while(strcmp(shell,"exit")!=0) { printfdir(); scanf("%s",shell); bash(shell); } free(shell); } shutdown(); } } puts("!!!HelloWorld!!!"); close(fd); returnEXIT_SUCCESS;}intbash(char*shell){ if(strcmp(shell,"cd")==0) { char*routel=(char*)malloc(140); scanf("%s",routel); cd(routel); free(routel); }elseif(strcmp(shell,"umask")==0){ intum; scanf("%o",&um); u_umask(um); }elseif(strcmp(shell,"passwd")==0){ char*ps=(char*)malloc(20); scanf("%s",ps); passwd(ps); free(ps); }elseif(strcmp(shell,"ls")==0){ ls(); }elseif(strcmp(shell,"chmod")==0){ char*chmode=(char*)malloc(140); intmod; scanf("%s%o",chmode,&mod); u_chmod(chmode,mod); free(chmode); }elseif(strcmp(shell,"pwd")==0){ pwd(); }elseif(strcmp(shell,"chown")==0){ char*chmode=(char*)malloc(140); scanf("%s",chmode); charown[2]; scanf("%s",&own); u_chown(chmode,(*own)-'0'); free(chmode); }elseif(strcmp(shell,"chgrp")==0){ char*grp=(char*)malloc(140); scanf("%s",grp); charg[2]; scanf("%s",&g); u_chgrp(grp,(*g)-'0'); free(grp); }elseif(strcmp(shell,"touch")==0){ char*grp=(char*)malloc(140); scanf("%s",grp); u_touch(grp); free(grp); }elseif(strcmp(shell,"rm")==0){ char*grp=(char*)malloc(140); scanf("%s",grp); rm(grp); free(grp); }elseif(strcmp(shell,"mkdir")==0){ char*mkr=(char*)malloc(140); scanf("%s",mkr); u_mkdir(mkr); free(mkr); }elseif(strcmp(shell,"rmdir")==0){ char*grp=(char*)malloc(140); scanf("%s",grp); u_rmdir(grp); free(grp); }elseif(strcmp(shell,"vi")==0){ char*grp=(char*)malloc(140); scanf("%s",grp); vi(grp); free(grp); }elseif(strcmp(shell,"cat")==0){ char*grp=(char*)malloc(140); scanf("%s",grp); u_cat(grp); free(grp); }elseif(strcmp(shell,"ln")==0){ char*old=(char*)malloc(140); char*new=(char*)malloc(140); scanf("%s",old); scanf("%s",new); u_ln(old,new); free(old); free(new); }elseif(strcmp(shell,"cp")==0){ char*op=(char*)malloc(140); char*re=(char*)malloc(140); scanf("%s",op); scanf("%s",re); u_cp(op,re); free(op); free(re); }elseif(strcmp(shell,"mv")==0){ char*op=(char*)malloc(140); char*re=(char*)malloc(140); scanf("%s",op); scanf("%s",re); u_mv(op,re); free(op); free(re); } return0;}/**init.c**Createdon:2015年1月6日*Author:sunb*/#include<time.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdlib.h>#include"super.h"#include"user.h"#include"inode.h"#include"list.h"#include"block.h"#include"file.h"#include"init.h"inticlose();intcmpus(structuser,intifd);intinit(){ super(); set_ds(); setf(); intii=-1; structiuseriu; mus.us.gid=0; mus.us.uid=0; mus.us.umask=01; iu.gid=0; iu.uid=0; iu.mode=01666; ii=ialloc(iu); if(ii==0){ f_inode[0].mi=i_get(ii); f_inode[0].f_count=1; f_inode[0].f_offest=0; f_inode[0].f_flag=6; } mus.fd=creatf("/etc",00666); //voidsetus(char*us,charusid,char*usg,charusgid,intum,char*pas) setus("root",0,"root",0,1,"as","/root/root"); //intwritef(intfd,constchar*buf,unsignedintcount) structuser*us=(structuser*)malloc(sizeof(structuser)); *us=mus.us; writef(mus.fd,us,sizeof(structuser)); setus("sun",1,"sun",1,1,"sun","/home/sun/sun"); *us=mus.us; writef(mus.fd,us,sizeof(structuser)); free(us); inthk=creatf("/root",01400); hk=creatf("/root/root",01400); hk=creatf("/home",01666); mus.us.gid=1; mus.us.uid=1; hk=creatf("/home/sun",01666); hk=creatf("/home/sun/sun",01666); iclose(); return0;}inticlose(){ intn=0; while(n<50){ if(f_inode[n].mi!=NULL){ closef(n); } n++; } supwrite(); return0;}intlogin(){ supread(); setf(); f_inode[0].mi=i_get(0); f_inode[0].f_count=1; f_inode[0].f_offest=0; f_inode[0].f_flag=06; intifd=openf("/etc",06); structuserbus; intiquit; do{ printf("输入用户名:\t"); scanf("%s",&(bus.username)); printf("\n输入密码:\t"); scanf("%s",&(bus.password)); if(0!=cmpus(bus,ifd)){ printf("\n退出:\t"); scanf("%d",&iquit); }else{ strcpy(name,mus.us.homedir); mus.fd=openf(&name,06); return1; } } while(0!=iquit); returniquit;}intcmpus(structuserbus,intifd){ //readf(intfd,char*buf,unsignedintcount); structuser*ius=(structuser*)malloc(sizeof(structuser)); f_inode[ifd].f_offest=0; while(readf(ifd,ius,sizeof(structuser))>0){ if(strcmp(ius->username,bus.username)==0&&strcmp(ius->password,bus.password)==0){ mus.off_t=f_inode[ifd].f_offest-sizeof(structuser); mus.us=*ius; return0; } } free(ius); f_inode[ifd].f_offest=0; return1;}intshutdown(){ iclose(); return0;}/**init.h**Createdon:2015年1月6日*Author:sunb*/#ifndefINIT_H_#defineINIT_H_intinit();intlogin();//intquit();intshutdown();#endif/*INIT_H_*//**inode.c**Createdon:2014年12月26日*Author:sunb*/#include<time.h>#include"inode.h"#include"super.h"#include"user.h"#include<stdio.h>#include<unistd.h>#include<string.h>intiread(inti,structinode*ifb){ off_tis=i*IB_size+I_beg*B_size; returnpread(fd,ifb,sizeof(structinode),is);}intiwrite(inti,structinode*ifb){ off_tis=i*IB_size+I_beg*B_size; returnpwrite(fd,ifb,sizeof(structinode),is);}intialloc(structiuserius){ inti=i_addr(); if(i>=0){ structinode*in=(structinode*)malloc(sizeof(structinode)); in->fsize=0; in->gid=ius.gid; in->uid=ius.uid; in->itime=time(NULL); in->fmode=ius.mode; in->fln=1; iwrite(i,in); free(in); returni; } return-1;}intifree(inti){ returni_rel(i);}structminode*i_get(inti){ structminode*mi=(structminode*)malloc(sizeof(structminode)); mi->iid=i; mi->mico=1; mi->chflg=0; structinode*in=(structinode*)malloc(sizeof(structinode)); iread(i,in); mi->in=*in; free(in); returnmi;}inti_put(structminode*im){ im->mico=0; if(im->chflg==1){ structinode*in=(structinode*)malloc(sizeof(structinode)); *in=im->in; iwrite(im->iid,in); free(in); } free(im); return0;}intsetf(){ inti=50; while(i--){ f_inode[i].f_count=0; f_inode[i].f_offest=0; f_inode[i].f_flag=06; f_inode[i].mi=NULL; } return0;}structiusersetiuser(intmode){ structiuserius; ius.gid=mus.us.gid; ius.uid=mus.us.uid; inti=0; ius.mode=mode; returnius;}/**inode.h**Createdon:2014年12月26日*Author:sunb*/#ifndefINODE_H_#defineINODE_H_#ifndefFMODE#endif//磁盘i节点#ifndefINODEstructinode{ unsignedintfsize;//文件大小(4) unsignedshortfln;//文件连接数(2) chargid;//文件所属组id(1) charuid;//文件拥有者id(1) intfmode;//文件的类型和权限(4) time_titime;//文件最后修改时间(8) unsignedintaddr[6];//文件地址(24)};#endif#ifndefIUSERstructiuser{ charuid; chargid; intmode;};#endifintiread(inti,structinode*);intiwrite(inti,structinode*);intialloc(structiuserius);intifree(inti);structiusersetiuser(intmode);//内存i节点#ifndefMINODEstructminode{ intiid;//i节点号 structinodein;// charchflg;//是否修改 unsignedshortmico;//进程连接的个数};#endifstructminode*i_get(inti);//获取内存inodeinti_put(structminode*);//删除内存inode#ifndefLS_MINODEstructls_minode{ unsignedintf_offest; intf_flag; unsignedshortf_count; structminode*mi;}f_inode[50];#endifintsetf();//初始化文件表#endif/*INODE_H_*//**list.c**Createdon:2015å¹´1月2æ—¥*Author:sunb*/#include<time.h>#include"super.h"#include"user.h"#include"inode.h"#include"list.h"#include"block.h"#include<string.h>intgetblock(unsignedintoffset,structinodein){ intb; intbuf[B_Df]; if(offset<=3) { b=in.addr[offset]; //printf("%dgetf%doffset\t",b,offset); }elseif(offset<B_Df+4){ bread(in.addr[4],0,B_Df*4,&buf); b=buf[offset-4]; //printf("%dgetf%doffset\t",b,offset); }elseif(offset<B_Mf){ intd=(offset-B_Df-4)/B_Df; intc=(offset-B_Df-4)%B_Df; bread(in.addr[5],0,B_Df*4,&buf); intf=buf[d]; bread(f,0,B_Df*4,&buf); b=buf[c]; //printf("%dgetf%doffset\t",b,offset); }else{ return-1; } returnb;}intsubblock(unsignedintoffset,structinodein){ intb; intbuf[B_Df]; if(offset<=4) { b=in.addr[offset-1]; brelse(b); //printf("%dsubf\t",b,offset); }elseif(offset<=B_Df+4){ bread(in.addr[4],0,B_Df*4,&buf); b=buf[offset-5]; brelse(b); if(offset==5){ brelse(in.addr[4]); //printf("%dsubf\t",in.addr[4]); } //printf("%dgetf\t",b); }elseif(offset<=B_Mf) { intd=(offset-B_Df-5)/B_Df; intc=(offset-B_Df-5)%B_Df; bread(in.addr[5],0,B_Df*4,&buf); intf=buf[d]; if(offset==(B_Df+4+1)){ brelse(in.addr[5]); //printf("%dsubf\t",in.addr[5]); } bread(f,0,B_Df*4,&buf); b=buf[c]; if(c==0) { brelse(f); //printf("%dsubf\t",f); } brelse(b); //printf("%dsubf\t",b); //if(offset%30==0) //puts("\n"); }else{ return-1; } returnb;}intifadd(unsignedintsize,structminode*im){ intfs=0; if(im->in.fsize==0){ fs=size/B_size; if(size%B_size!=0){ fs++; } }else{ fs=(im->in.fsize+size)/B_size; intds=size%B_size; intts=im->in.fsize%B_size; if((im->in.fsize+size)%B_size>0){ fs++; } //printf("%d",fs); } intoffset=im->in.fsize/B_size; if(im->in.fsize%B_size>0) { offset++; } if(fs>B_Mf){ puts("超出范围add"); return-1; } while(fs>offset) { //if(offset%30==0) //puts("\n"); if(offset<4) { intfb=balloc(); offset++; im->in.addr[offset-1]=fb; //printf("%dadd%doffset\t",fb,offset); }elseif(offset<B_Df+4){ int*buf=(int*)malloc(B_Df*4); if(offset==4){ intft=balloc(); im->in.addr[4]=ft; } intfb=balloc(); offset++; //printf("%dadd%doffset\t",fb,offset); bread(im->in.addr[4],0,4*B_Df,buf); buf[offset-5]=fb; bwrite(im->in.addr[4],0,4*B_Df,buf); free(buf); }elseif(offset<B_Mf){ int*buf=(int*)malloc(4*B_Df); int*but=(int*)malloc(4*B_Df); if(offset==B_Df+4){ intfa=balloc(); im->in.addr[5]=fa; } intd=(offset-4-B_Df)/B_Df; intc=(offset-4-B_Df)%B_Df; bread(im->in.addr[5],0,4*B_Df,buf); intf=buf[d]; if(c==0){ intfa=balloc(); buf[d]=fa; bwrite(im->in.addr[5],0,B_Df*4,buf); f=fa; } bread(f,0,B_Df*4,but); intfa=balloc(); but[c]=fa; offset++; //printf("%daddf%doffset\t",fa,offset); bwrite(f,0,B_Df*4,but); free(buf); free(but); }else{ return-1; } } //puts("\n"); im->in.fsize=im->in.fsize+size; im->chflg=1; returnfs;}//返回剩余文件块的个数intifsub(unsignedintsize,structminode*im){ if(size>im->in.fsize) { size=im->in.fsize; } intfi=im->in.fsize/B_size; if(im->in.fsize%B_size!=0){ fi++; } intk=(im->in.fsize-size)/B_size; if((im->in.fsize-size)%B_size!=0){ k++; } //printf("%d\t%d\n",fi,k); while(fi>k) { intbr=subblock(fi,im->in); fi--; } im->in.fsize=im->in.fsize-size; im->chflg=1; returnk;}/**list.h**Createdon:2015年1月2日*Author:sunb*/#ifndefLIST_H_#defineLIST_H_//目录#ifndefLISTstructlist{ charls_name[14]; unsignedshortib;};#endifintgetbloc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论