资源描述
计算机操作系统 课程设计报告 设计项目名称: 文件系统设计 专 业: 网络工程 班 级: 201001 学 号: 201026340117;201026340121 姓 名: 张世波 赵流男 指 导 教 师: 张 瑞 红 请预览后下载!目录1 课程设计简介11.1 课程设计的目的11.2 课程设计内容12 数据结构的设计22.1 预定义22.2 结构体22.3 全局变量和函数23 功能模块(或算法)描述33.1 模块划分43.2 模块流程图64 程序运行结果45心得体会5参考文献6附源代码7请预览后下载!1 课程设计简介1.1 课程设计的目的课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。1.2 课程设计内容课程设计内容设计一个简单的多用户文件系统。即在系统中用一个文件来模拟一个磁盘;此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。实现这个文件系统。能实际演示这个文件系统。基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录(AFD)。3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。4)因系统小,文件目录的检索使用了简单的线性搜索。5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录,如图5.1所示。 请预览后下载!2 数据结构的设计2.1 预定义#define BLOCKSIZ 512/磁盘块的大小#define DATABLKNUM 512/数据块的数目#define BLKGRUPNUM50/数据块组包含多少数据块#define P_N_BLOCKS15/inode节点中 指向数据块的指针个数#defineGROUPNUMDATABLKNUM/BLKGRUPNUM+1 /数据块组 组数#define DINODESIZ 512/磁盘i结点区的大小(空间32512)#define DINODENUM 32/磁盘i结点区的块数#define SYSOPENFILE 40#define DIRNUM 32/一个目录下的最多目录和文件的总和数#define DIRSIZ 14/文件、目录名的长度(字节)#define UPWDSIZ 15/密码的长度#define UNAMSIZ 15/用户名的长度#define PWDSIZsizeof(struct pwd) /密码结构的长度 #define PWDNUM BLOCKSIZ/PWDSIZ/密码数据空间的大小(pwd为单位)#define NOFILE 20/一个用户最多可以打开的文件数目#define DINODESTART 4*BLOCKSIZ/i结点区的开始地址-inodes table ,1引导 2超块 3block bitmap 4inode bitmap #define DATASTART (2+DINODENUM)*BLOCKSIZ/数据区的开始地址#defineDATASTARTNO36/数据区开始指针#define DIMODE_EMPTY00000/*可以用的空间*/#define DIMODE_FILE00001#define DIMODE_DIR 00002#define DIMODE_PASSWD00004#define GRUP_00/管理员组#define GRUP_11#define GRUP_22#define GRUP_442.2 结构体/磁盘i结点结构,struct inode/ chardi_nameDIRSIZ;请预览后下载! unsigned _int16 di_ino;/*磁盘i节点标识*/ unsigned _int16 di_number;/*关联文件数,当为0时表示删除文件*/ unsigned _int16 di_mode;/*存取权限*/ unsigned _int16 di_uid;/*磁盘i节点用户id*/ unsigned _int16 di_gid;/*磁盘i节点权限组id*/ /1管理员组 2用户组 unsigned _int32 di_size;/*文件大小*/ unsigned _int32 di_ctime; /* Creation time */ unsigned _int32 di_mtime; /* Modification time */ unsigned _int16 di_blockP_N_BLOCKS; /* 一组 block 指针 */ ;/目录项结构struct directchard_nameDIRSIZ;/*目录名(14字节)*/_int16 d_ino;/*目录号*/;/超级快结构struct super_blockunsigned _int16 s_inodes_count; /* inodes 计数 */unsigned _int16 s_blocks_count; /* blocks 计数 */unsigned _int16 s_r_blocks_count; /* 保留的 blocks 计数 */unsigned _int16 s_free_blocks_count; / 空闲的 blocks 计数 unsigned _int16 s_free_inodes_count; /* 空闲的 inodes 计数 */unsigned _int16 s_free_blocks_groupGROUPNUM;/新增 一个数组来记录每个数据块组中的空闲数据块计数 unsigned _int16 s_first_data_block; /* 第一个数据 block */unsigned _int16 s_log_block_size; /* block 的大小 */unsigned _int16 s_blocks_per_group; /* 每 block group 的 block 数量 */unsigned _int16 s_inodes_per_group; /* 每 block group 的 inode 数量 */;/用户密码struct pwdunsigned _int8 p_uid;unsigned _int8 p_gid;char usernameUNAMSIZ;/*用户名 新加的*/ char passwordUPWDSIZ;/目录结构struct dirstruct direct directDIRNUM;_int16 size;请预览后下载!2.3 全局变量和函数/全局变量unsigned _int8 di_bitmapDINODENUM;/ 硬盘inode节点位图1表示已使用 0表示未使用unsigned _int8bk_bitmapDATABLKNUM;/ 数据块block位图 struct super_block filsys;/超级块struct pwd pwdPWDNUM;FILE *fd;/文件指针struct inode *cur_inode;/i节点当前目录指针struct inode *inodetemp;/i节点指针const char fsystemname20=Linux.EXT2;/模拟硬盘的文件名struct direct dir_bufBLOCKSIZ / sizeof(struct direct);/目录数组char cmdhead20;/cmd 的头 表示所在哪个文件夹、int i_lock=0;/inode位图锁 可能会多线程int b_lock=0;/block位图锁struct pwd *cur_user;/*全局函数*/extern intFormat();/格式化磁盘extern intInstall();/启动,安装文件系统struct inode * read_inode(int);/install里面读取文件dinodestruct direct * read_dir_data(int);/读取存储文件夹的物理块extern void showdir();/命令 dirint Enterdir(char);/进入某个文件夹 命令- cd 文件名int Fd_dirfile(char);/查找当前目录里的文件 没找到返回-1 找到返回inode号int Iscmd(char);/判断是否两个字符串的命令void two_cmd(char,char);/两个字符串的命令int creat(char);/创建文件void changeinode();/交换指针char * ReadFile(char);/读取文件int mkdir(char);/创建文件夹void showbitmap();/显示位图int deletefd(char);/删除文件int editfile(char);/编辑文件int rename(char);/重命名void showhelp();/命令帮助void login();void logout();int access();/权限判断/*磁盘i节点的分配与释放(当一个新文件被建立的时候,在给该文件分配磁盘存储区之前,应为该文件分配存放该文件说明信息的磁盘i节点,当从文件系统中删除某个文件时,应首先删除它的磁盘i节点项。)*/ intialloc();/*开辟一个空闲的i节点,返回i节点*/磁盘块分配与释放函数intballoc(int);/申请硬盘空间请预览后下载!结构体说明:硬盘模拟文件:每个数据块512字节,第一个数据块空闲备用,第2块是超级块,第3块是inode位图,第4块是block位图,第5块开始有32块是inode节点,然后是数据区block,512块。超级块:存放整个文件系统的基本状态,如:inode块数,block总块数,空闲的block计数,空闲的inode计数,每个数据块组中的空闲块数(为block分组,便于读取),每个block的大小(512字节),每个数据块组的block块数。Inode位图:用一个数组来描述每个inode的使用状况,1表示被占用,0表示空闲。Block位图:用一个数组来描述每个数据区的block的使用状况,1表示被占用,0表示空闲。inode节点:inode记录了文件或者目录在数据区存放位置,是文件还是目录,是否系统文件,属于管理员组还是普通用户组,是由谁创建的,创建时间等。如果是目录,则还记录了里面包含多少个文件或子目录。是文件则记录了文件的大小。读取文件要先通过inode然后找到block,才能读取。Block数据块:存放文件的地方,如果是目录则记录了这个目录下所有的文件和子目录的名称和所占的inode如果是文本文档,则是字节流文件。3 功能模块(或算法)描述我负责整体设计,实现底层具体设计,format格式化,install安装,login登录,ialloc申请inode空间,balloc申请block空间。3.1 format 格式化只写打开模拟文件,初始化超级快,初始化dinode位图 block位图,初始化主目录,初始化etc目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化 用户passwd文件,写入模拟硬盘文件。3.2 install 安装读写打开模拟文件,读取dinode位图 block位图,读取主目录,读取etc目录,读取管理员admin 目录,读取用户xiao 目录,读取 用户passwd文件。 3.3 login 登陆用户输入用户名和密码,在passwd文件中查找是否有此用户,核对密码。正确则登陆成功,当前目录设定到当前用户文件夹下。登录流程图3.4 ialloc 申请inode空间先检测inode位图是否加锁,是则退出。加锁,检测inode空间是否还有已满,是则退出。在inode位图中顺序查找空闲的inode,找到则返回inode地址,block解锁。函数结束。流程图3.3请预览后下载!登录流程图ialloc 流程图3.3balloc流程图3.43.5 balloc 申请block空间先检测block位图是否加锁,是则退出。加锁,检测block空间是否还有k个空闲,否则退出。在还有空闲block的组中查找是否有k个空闲,没有则去下一个block组中查找,找到则返回block地址,block解锁。函数结束。流程图3.43.5 create 创建文本文件查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以#结束。申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。将文件内容写入inode空间和block空间。修改当前目录的结构,修改超级快,修改inode位图,block位图,写入模拟硬盘。流程图3.53.7 cdir 创建文件夹查找当前目录下是否有同名文件,是则退出,否则,申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。将文件夹内容写入inode空间和block空间。修改当前目录的结构,修改超级快,修改inode位图,block位图,写入模拟硬盘。3.7 read edit 读取和追加文本文件Read-查找当前目录下是否该文件,没有则退出,否则调用access()权限判断,有权限则判断是不是文件,不是则退出,是文件则读取文件并显示。Edit-调用读取文件模块,读取成功则用户输入追加的内容,如果追加的内容大于一个block则申请block空间,失败则退出,申请成功则保存文件。3.8 access(文件名) 权限判断先判断当前目录是否有该文件,在当前目录的block找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。请预览后下载!如果是该用户创建的 则有读写权限如果当前用户是管理员组的 也具有读写权限如果该文件是用户可查看文件则都具有权限。3.9 cd 进入子目录 或上级目录查找当前目录是否有该子目录,没有则退出,调用access()判断当前用户是否有权限,无则退出,有则读取该子目录的inode,将当前目录指向该目录。3.10 attr(文件名)查看文件或者文件夹的属性先查找当前目录下是否有该文件或目录,有则判断文件是否系统文件,是否文本文件,是否目录,由谁创建,属于什么组,占用的block,和inode。将其全部显示出来。3.9 del 删除文件或目录查找当前目录是否有该文件名,没有则退出,有则调用access()判断是否有权限,有则判断是否为系统文件,是则无法删除,不是则判断是否是文件,是文件则直接删除,不是则判断是否文件夹,是文件夹则判断该文件夹下是否有文件,有文件则无法删除。提示用户是否删除,确认则删除文件,修改当前文件夹inode,block结构,修改该文件占有的inode和block位图为0,修改超级块,写入模拟硬盘。流程图3.93.8 access(文件名) 权限判断先判断当前目录是否有该文件,在当前目录的block找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。如果是该用户创建的 则有读写权限如果当前用户是管理员组的 也具有读写权限如果该文件是用户可查看文件则都具有权限。请预览后下载!4 程序运行结果1格式化 和登录界面 登录后显示帮助信息 ,进入到用户文件夹下2 dir命令-显示当前目录下的文件和目录3 logout命令-注销用户请预览后下载!普通用户无法进入admin管理员目录。请预览后下载!5心得体会操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全面提高学生的综合素质。在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不过设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我学得到很多实用的知识,再次我表示感谢!同时,对给过我们帮助的所有同学和各位指导老师再次表示忠心的感谢!请预览后下载!参考文献1 袁庆龙,候文义Ni-P合金镀层组织形貌及显微硬度研究太原理工大学学报,2001,32(1):51-53.(连续出版物:序号 主要责任者文献题名J刊名,出版年份,卷号(期号):起止页码)2刘国钧,王连成图书馆史研究北京:高等教育出版社,1979:15-18,31(专著:序号 主要责任者文献题名出版地:出版者,出版年:起止页码)3 孙品一高校学报编辑工作现代化特征中国高等学校自然科学学报研究会科技编辑学论文集(2)北京:北京师范大学出版社,1998:10-22(论文集:序号 主要责任者文献题名主编论文集名出版地:出版者,出版年:起止页码)请预览后下载!附:源代码/*makefile*/filsys:main.o igetput.o iallfre.o ballfre.o name.o acess.o log.o close.o create.o delete.o dir.o dirlt.o open.o rdwt.o format.o install.o halt.occ -o filsys main.o igetput.o iallfre.o ballfre.o name.o acess.o log.o close.o create.o delete.o dir.o dirlt.o open.o rdwt.o format.o install.o halt.o main.o:main.c filesys.h cc -c main.cigetput.o:igetput.c filesys.h cc -c igetput.ciallfre.o:iallfre.c filesys.h cc -iallfre.cballfre.o:ballfre.c filesys.h cc -c ballfre.cname.o:name.c filesys.h cc -c name.caccess.o:access.c filesys.h cc -c access.clog.o:log.c filesys.h cc -c log.cclose.o:close.c filesys.h cc -c close.ccreate.o:create.c filesys.h cc -c create.cdelete.o:delete.c filesys.h cc -c delete.c dir.o:dir.c filesys.h cc -c dir.c dirlt.o:dirlt.c filesys.h cc -c dirlt.copen.o:open.c filesys.h cc -c open.crdwt.o:rdwt.c filesys.h cc -c rdwt.cformat.o:format.c filesys.h cc -c format.c install.o:install.c filesys.h cc -c install.c halt.o:halt.c cc -c halt.c请预览后下载!/*filesys.h*/#define BLOCKSIZ 512#define SYSOPENFILE 40#define DIRNUM 128#define DIRSIZ 14#define PWDSIZ 12#define PWDNUM 32#define NOFILE 20#define NADDR 10#define NHINO 128#define USERNUM 10#define DINODESIZ 32/*filesys*/#define DINODEBLK 32 #define FILEBLK 512#define NICFREE 50#define NICINOD 50#define DINODESTART 2*BLOCKSIZ#define DATASTART(2+DINODEBLK)*BLOCKSIZ/*di_mode*/#define DIEMPTY 0000#define DIFILE 01000#define DIDIR 02000#define UDIREAD 00001#define UDIWAITE 00002#define UDIEXICUTE 00004#define GDIREAD 00010#define GDIWRITE 00020#define GDIEXICUTE 00040#define ODIREAD 00100#define ODIWRITE 00200#define ODIEXICUTE 00400#define READ 1#define WRITE2#define EXICUTE 4#define DEFAULTMODE 00777/*i_flag*/请预览后下载!#define IUPDATE 00002/*s_fmod*/#define SUPDATE 00001/*f_flag*/#define FREAD 00001#define FWRITE 00002#define FAPPEND 00004/*error*/#define DISKFULL 65535/*fseek origin*/#define SEEK_SET 0sruct inodestruct inode *i_forw;struct inode*i_back;char i_flag;unsigned int i_ino;unsigned int i_count;unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned int di_size;unsigned int di_addrNADDR; ; struct dinodeunsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned long di_size;unsigned int di_addrNADDR;struct directunsigned d_nameDIRSIZ;unsigned int d_ino;请预览后下载!struct filsysunsigned short s_isize;unsigned long s_fsize;unsigned int s_nfree;unsigned short s_pfree;unsigned int s_freeNICFREE;unsigned int s_ninode;unsigned short s_pinode;unsigned int s_inodeNICINOD;unsigned int s_finode;char s_fmod; struct pwdunsigned short p_uid;unsigned short p_gid;unsigned passwordPWOSIZ;struct dirstruct direct directDIRNUM;int size;struct hinodestruct inode* i_forw;struct filechar f_flag;unsigned int f_count;struct inode *f_inode;unsigned long f_off;struct userunsigned short u_default_mode;unsigned short u_uid;unsigned short u_gid;unsigned short u_ofileNOFILE;请预览后下载!extern struct hinode hinodeNHINO;extern struct dir dir;extern struct file sys_ofileSYSOPENFILE;extern struct filsys filsys;extern struct pwd pwdPWDNUM;extern struct user userUSERNUM;extern FILE *fd;extern struct inode *cur_path_inode;extern int user_id,file_block;extern struct inode *iget();extern iput();extern unsigned int balloc();extern bfree();extern struct inode *ialloc();extern ifree();extern unsigned int namei(); extern unsigned int iname();extern unsigned int access();extern _dir();extern mkdir();extern chdir();extern dirlt();extern unsigned short open(); extern create();extern unsigned int read();extern unsigned write();extern int login();extern logout();extern install();extern format();extern close();extern halt();#include#include#includefilesys.hstruct hinode hinodeNHINO;struct dir dir;struct file sys_ofileSYSOPENFILE;struct filsys filsys;请预览后下载!struct pwd pwdPWDNUM;struct user userPWDNUM;FILE *fd;struct inode* cur_path_inode;int user_id,file_block;main() unsigned short ab_fd1,ab_fd2,ab_fd3,ab_fd4;unsigned short bhy_fd1;char *buf;printf(nDo you want to format the diskn);if(getchat()=y)printf(Format will erase all context on the disk.Are you sure?n);getchar();elsereturn;if(getchar()=y)formar();elseretrun;install();_dir();login(2118,abcd);user_id=0;mkdir(a2118);chdir(a2118);ab_fd1=creat(user_id,file0.c,01777);file_block=BLOCKSIZ*6+5;buf=(char*)malloc(BLOCKSIZ*6+5);write(ab_fd1,buf,BLOCKSIZ*6+5);close(user_id,ab_fd1);free(buf);mkdir(subdir);chdir(subdir);ab_fd2=creat(user_id,file1.c,01777);file_block=BLOCKSIZ*4+20;buf=(char*)malloc(BLOCKSIZ*4+20);write(ab_fd2,buf,BLOCKSIZ*4+20);请预览后下载!close(user_id,ab_fd2);free(buf);chdir(.);ab_fd3=creat(user_id,file2.c,01777);file_block=BLOCKSIZ*3+255;buf=(char*)malloc(BLOCKSIZ*3+255);write(ab_fd3,buf,BLOCKSIZ*3+255);close(user_id,ab_fd3);free(buf);_dir();delete(ab_file0.c);ab_fd4=creat(user_id,file3.c,01777);file_block=BLOCKSIZ*8+300;buf=(char*)malloc(BLOCKSIZ*8+300);write(ab_fd4,buf,BLOCKSIZ*8+300);close(user_id,ab_fd4);free(buf);_dir();ab_fd3=open(user_id,file2.c,FAPPEND);file_block=BLOCKSIZ*3+100;buf=(char*)malloc(BLOCKSIZ*3+100);write(ab_fd3,buf,BLOCKSIZ*3+100);close(user_id,ab_fd3);free(buf);_dir();chdir(.);logout();halt();#include#includefilesys.hformat()struct inode *inode;struct direct dir_bufBLOCKSIZ/(DIRSIZ+2);struct files;请预览后下载!unsigned int block_bufBLOCKSIZ/sizeof(int);char *buf;int i,j;fd=fopen(filesystem,r+w+b);buf=(char*)malloc(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char);if(buf=NULL)printf(nfile system file creat failed! n);exit(0);fseek(fd,0,SEEK_SET);fwrite(buf,1,(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char),fd);pwd0.p_uid=2116;pwd0.p_gid=03;strcpy(pwd0.password,dddd);pwd1.p_uid=2117;pwd1.p_gid=03;strcpy(pwd1.password,bbbb);pwd2.p_uid=2118;pwd2.p_gid=04;strcpy(pwd2.password,abcd);pwd3.p_uid=2119;pwd3.p_gid=04;strcpy(pwd3.password,cccc);pwd4.p_uid=2220;pwd4.p_gid=05;strcpy(pwd4.password,eeee);inode=iget(1);inode-di_number=1;inode-di_mode=DEFAULTMODE|DIDIR;inode-di_size=3*(DIRSIZ+2);inode-di_addr0=0;strcpy(dir_buf0.d_name,.);dir_buf0.d_ino=1;strcpy(dir_buf1.d_name,.);dir_buf1.d_ino=1;strcpy(dir_buf2.d_name,ect);请预览后下载!dir_buf2.d_ino=2;fseek(fd,DATASTART,SEEK_SET);fwrite(dir_buf,1,3*(DIRSIZ+2),fd);iput(inode);inode=iget(2);inode-di_number=1;inode-di_mode=DEFAULTMODE|DIDIR;inode-di_size=3*(DIRSIZ+2);inode-di_addr0=1;strcpy(dir_buf0.d_name,.);dir_buf0.d_ino=1;strcpy(dir_buf1.d_name,.);dir_buf1.d_ino=2;strcpy(dir_buf2.d_name,password);dir_buf2.d_ino=3;fseek(fd,DATASTART+BLOCKSIZ*1,SEEK_SET);fwrite(dir_buf,1,3*(DIRSIZ+2),fd);iput(inode);inode=iget(3);inode-di_number=1;inode-di_mode=DEFAULTMODE|DIDIR;inode-di_size=BLOCKSIZ;inode-di_addr0=2;for(i=5;i,PWDNUM;i+)pwdi.p_uid=0;pwdi.p_gid=0;strcpy(pwdi.password, )fseek(fd,DATASTART+2*BLOCKSIZ,SEEK_SET);fwrite(pwd,1,BLOCKSIZ,fd);iput(inode);filsys.s_isize=DINODEBLK;filsys.s_fsize=FILEBLK;filsys.s_ninode=DINODEBLK;filsys.s_nfree=FILEBLK-3;for(i=0;iNICINOD;i+)请预览后下载!filsys.s_inodei=4+i;filsys.s_pinode=0;filsys.s_rinode=NICNOD+4;block_bufNICFREE-1=FILEBLK+1;for(i=0;iiNICFREE-1;i+)for(j=0;j2;i-)filsys.s_freeNICFREE-1+i-j=i;filsys.s_pfree=NIVFREE-1-j+3;filsys.s_pinode=0;fseek(fd,BLOCKSIZ,SEEK_SET);fwrite(&filsys,1sizeof(filsys),fd);fseek(fd,BLOCKSIZ,SEEK_SET);fread(&filsys.s_size,a,sizeof(filsys),fd);#include#include#includefilsys.hinstall()请预览后下载!int i,j;fseek(fd,BLOCKSIZ,SEEK_SET);fread(&filsysk,1,sizeof(struct filsys),fd);for(i=0;iNHINO;i+)hinodei.i_forw=NULL;for(i=0;iSYSOPENFILE;i+)sys_ofilei.f_count=0;sys_ofilei.f_inode=NULL;for(i=0;iUSERNUM;i+)useri.u_uid=0;useri.u_gid=0;for(j=0;jdi_size/(DIRSIZ+2);for(i=0;iDIRNUM;i+)strcpy(dir.directi.d_name,);dir.directi.d_ino=0;for(i=0;idi_addri,SEEK_SET);fread(&dir.directBLOCKSIZ/(DIRSIZ+2)*i1,BLOCKSIZ,fd);fseek(fd,DATASTART+BLOCKSIZ*cur_path_inode-di_addri,SEEK_SET);fread(&dir.direct(BLOCKSIZ)/(DIRSIZ+2)*i,1,cur_path_inode-di_size%BLOCKSIZ,fd);#include请预览后下载!#includefilesys.hhalt()struct inode *inode;int i,j;chdir(.);iput(cur_path_inode);for(i=0;iUSERNUM;i+)if(useri.u_uid!=0)for(j=0;jNOFILE;j+)if(useri.u_ofilej!=SYSOPENFILE+1)close(i,j);useri.u_ofilej=SYSOPENFILE+1;fseek(fd,BLOCKSIZ,SEEK_SET);fwrite(&filsys,1,sizeof(struct filsys).fd);fclose(fd);printf(nGOODBYE bye. See you Next Time.Please turn off the switchn);exit(0);#include#inclodufilesys.hstruct inode *iget(dinodeid)unsigned int dinodeid;请预览后下载!int existed=0,inodeid;long addr;struct inode *temp,*newinode;inodeid=dinodeid%NHINO;if(hinodeinodeid).i_forw=NULL)existed=0;elsetemp=hinodeinodeid.i_forw;while(temp)if(temp-i_ino=inodeid)/*existed*/existed=1;temp-i_count+;return temp;elsetemp=temp-i_forw;addr=DINODESTART+dinodeid*DINODESIZ;newinode=(struct inode*)malloc(sizeof(struct inode)fseek(fd,addr,SEEK_SET);fread(&(newinode-di_number),DINODESIZ,1,fd);newinode-i_forw=hinodeinodeid.i_forw;newinode-i_back=newinodelif(newinode-i_forw!=NULL) newinode-i_forw-i_back=newinode;hinodeinodeid.i_forw=newinode;newinode-i_count=1;newinode-i_flag=0;newinode-_ino=dinodeid;newinode-di_size=3*(DIRSIZ+2);if(dinodeid=3)newinode-di_size=BLOCKSIZ;请预览后下载!return newinode;input(pinode) /*input()*/struct inode *pinode; long addr; unsigned int block_num; int i; if(pinode-i_count1)
展开阅读全文