操作系统模拟unix文件系统实验报告要点

上传人:无*** 文档编号:29380464 上传时间:2021-10-07 格式:DOCX 页数:49 大小:3.10MB
收藏 版权申诉 举报 下载
操作系统模拟unix文件系统实验报告要点_第1页
第1页 / 共49页
操作系统模拟unix文件系统实验报告要点_第2页
第2页 / 共49页
操作系统模拟unix文件系统实验报告要点_第3页
第3页 / 共49页
资源描述:

《操作系统模拟unix文件系统实验报告要点》由会员分享,可在线阅读,更多相关《操作系统模拟unix文件系统实验报告要点(49页珍藏版)》请在装配图网上搜索。

1、操作系统大型实验班级:学号:姓名:一实验介绍1. 实验名称2. 实验目的3. 实验内容及要求二实验环境三实验设计1 .数据结构设计2 .系统流程设计3 .实现命令操作四模块详解1 .文件操作2 . 用户操作五实验演示1 .初始化磁盘块2 .用户登录3 .目录操作4 .文件操作六源代码七实验心得体会1 .调试中遇到的问题总结2 .实验感悟一、实验介绍1. 实验名称操作系统大型实验2. 实验目的完成一个 UNIX/Linux 文件系统的子集的模拟实现, 了解 Unix 文件系统的实现机制。3. 实验内容及要求( 1 ) 文件卷结构设计0#块可省略I 节点栈及空间为20 项块大小为 512 字节卷盘

2、块数大于100I 节点盘块数大于 10 块( 2 ) I 节点结构设计文件大小文件联接计数文件地址文件拥有者文件所属组文件权限及类别文件最后修改时间其中文件地址为六项:四个直接块号,一个一次间址,一个两次间址( 3 )目录结构用 16 字节表示,其中 14 字节为文件名, 2 字节为 I 节点号( 4 )用户及组结构用户信息中包括用户名、口令,所属组,用户打开文件表( 5 )文件树结构除(4)要求外,适当考虑UNIX本身文件树结构( 6 )实现功能Ls显示文件目录Chmod改变文件权限Chown改变文件拥有者Chgrp改变文件所属组Pwd显示当前目录Cd改变当前目录Mkdir创建子目录Rmdi

3、r删除子目录Mv改变文件名Cp文件拷贝Rm文件删除Ln建立文件联接Cat连接显示文件内容Vi文件写入Mk创建文件HelpumaskUmaskPasswdLs-l Login Logout查看用户屏蔽码 文件创建屏蔽码修改用户口令 查看文件类型 用户注销 退出系统显示帮助信息二、实验环境实验设备:Microsoft Visual Studio 2010开发语言:c+三、实验设计1. 数据结构设计磁盘文件结构设计:用一个名为 disk.txt 的文件模拟Unix 系统磁盘 ,总共分为 200 块,每块 514 个字节(实际可用 512 个字节,还有2 个字节是磁盘分割符 n ) ,使第一块(0#)

4、盘块做为超级块,记录该系统磁盘的使用情况;第二块(1#)盘块第十三块(12# )盘块作为存储I结点使用, 每个 I 结点 74 个字节, 所以每个盘块可以存放 6 个 I 结点, 总共有 72 个 I 结点,记录在超级块中;十三块(12#)以后的盘块作为存储文件内容使用,总共187 个盘块,用成组连接法记录在超级块中。对于 I 结点的具体设计如下:class INode /(74B) public:int fsize; / 文件大小setw(6)int fbnum; / 文件盘块数 setw(6)int addr4 ;/ 四个直接盘块号 文件最大为 4*512=2048=2KB setw(4)

5、*4int addri; / 一个一次间址()文件大于 2KB,小于 2KB+16*512=10KB setw(4)int addr2;一个两次间址()文件大于 10KB,小于 10KB+16*16*512B=138KB setw(4)char owner6;/ 文件拥有者setw(6)char group6;/ 文件所属组setw(6)char mode12; / 文件类别及存储权限setw(12)char ctime10; / 最近修改时间 setw(10) int connect; / 文件联接计数;对于超级块的具体设计如下:class superBlock public:int FIS

6、tack72; /空闲结点号栈int FICount; /空闲i结点总数int FlPtr; /空闲结点栈指针setw(3)*72setw(3)setw(3)int FBStack10; /空闲盘块号栈int FBCount; /空闲盘块总数int FBPtr; /空闲盘块栈指针setw(4)*10setw(4)setw(3);除了超级块、 I 结点、磁盘文件的数据结构设计以外,为了系统操作方便,我还设计了 用户类、文件目录类。 用户类具体设计:class USER / 用户 (24B) public:char name6; / 用户名 setw(6)char pass6; / 密码 setw

7、(6)char group6; / 所属组 setw(6)int umask3 ;/ 用户 umask码 setw(6) ;用户信息全部存放在一个user.txt 的文件里面, 所以对于 user.txt 文件也有一个设计,文件最开始是存放用户总数( setw(6) ) ,随后跟着的是每一位用户名、密码、所属组、用户 umask 码。文件目录类具体设计:class Catalog / 目录项 (18B) public:char fname14;/ 文件名setw(14)int index;/i 结点号 setw(4);目录信息全部都存放在 disk 磁盘里面,所以具体数据结构设计都在上面的磁盘

8、文件设 计中提及。2. 程序流程设计 系统主体流程图设计见图1 用户注册流程图见图2 登陆功能流程图见图 3 用户修改口令流程图见图 4 用户umask码修改流程图见图5 显示所有子目录ls操作流程图见图6 创建文件 mk、目录mkdir流程图见图7 删除文件rm流程图见图8 删除目录文件rmdir流程图见图9 改变当前路径 cd操作流程图见图10 查看文件内容 cat操作流程图见图11 拷贝文件、目录cp操作流程图见图12 建立文件联接ln操作流程图见图13 修改文件名称MV契作流程图见图14 修改文件权限chmod操作流程图见图15 修改文件拥有者chown、所属组chgrp操作流程图见图

9、16 写流程图vi见图17开始NY文件系统初始化?文件系统初始化N注册并登陆是否为新用尸?直接登陆读入超级块中信息输入命令分析命令文件创建屏蔽码查看文件类型帮助信息显示查看用户屏蔽码创建文件 文件写入显示文件内容建立文件联接文件删除*文件拷贝改变文件名删除子目录创建子目录改变当前目录显示当前目录改变文件所属组改变文件拥有者改变文件权限显示目录修改用户口令系统退出用户注销图1系统主体流程图开始N图3登陆功能流程图开始开始图7 创建文件mk目录mkdir流程图开始文件删除失败文件删除成功图8删除文件rm流程图递归删除开始N回收目录的盘块、结点图9删除目录文件rmdir流程图图10改变当前路径cd操

10、作流程图图11查看文件内容cat操作流程图图12拷贝文件、目录cp操作流程图图13建立文彳联接ln操作流程图开始图14修改文件名称MVB作流程图图15修改文件权限chmod操作流程图图16修改文件拥有者 chown、所属组chgrp操作流程图开始输入文件名图17写文件vi操作流程图手动输入内容选择系统填充的字符个数3. 实现命令操作cdenter .enter切换到当前目录cdenter /enter切换到根目录cdenter .enter切换到父目录catenter fileenter查看当前目录下名为file 的文件内容vienter fileenterfile 的文件写入一定内容pwde

11、nter lsenterchmodenter fileenter chownenter fileenter chgrpenter fileenter MVenter fileenter loginenter passwdenter umaskenterUmaskenter codeenter显示当前目录 显示所有子目录改变当前目录下名为file文件的权限改变当前目录下名为file文件的拥有者改变当前目录下名为file文件的所属组改变当前目录下名为file文件的文件名用户注销,可以重新登陆用户改变密码查看用户umask 码修改用户umask 码为codelnenter file1enter fi

12、le2enterls-lenter fileenterhelpenterlogoutenter四、模块详解1. 文件操作文件 file1 与 file2查看文件 file 的类别提供帮助退出系统建立连结cdenter stringenter切换到指定路径的目录,string 为路径mkdirenter direnter当前目录下创建名为 dir的子目录rmdirenter direnter删除当前目录下名为 dir的子目录mkenter fileenter当前目录下创建名为 file的文件rmenter fileenter删除当前目录下名为 file的文件切换到某一子目录,dir 为子目录名c

13、denter direntercpenter dirORfileenter stringenter拷贝当前目录下文件或子目录到指定路径下 mk创建文件模块,输入mk命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的数据文件。 在该创建过程中首先要判断该目录中有没有同名的文件, 如果有的话就创建失败, 还要判断在该目录下有没有创建文件的权限, 有权限才可以创建。具体流程图查看第二节,系统流程图设计部分。 rm删除文件模块,输入 rm命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。 在该删除过程中要判断该目录中是否存在该文件,

14、 如果不存在就没有必要执行该操作了, 还要判断在该目录下有没有删除文件的权限, 有 权限才可以删除。具体流程图查看第二节,系统流程图设计部分。 mkdir创建目录文件模块,输入 mkdir命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的目录文件。 在该创建过程中首先要判断该目录中有没有同名的文件, 如果有的话就创建失败, 还要判断在该目录下有没有创建文件的权限,有权限才可以创建。具体流程图查看第二节,系统流程图设计部分。 rmdir删除目录文件模块,输入 rmdir命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的目录文件。 在该删

15、除过程中要判断该目录中是否存在该目录文件, 如果不存在就没有必要执行该操作了, 还要判断在该目录下有没有删除文件的权限,有权限才可以删除。删除的时候要判断该目录是否为空, 如果里面有内容,则要通过递归函数,将他们一并删除了。具体流程图查看第二节,系统流程图设计部分。 cp拷贝文件模块,输入 cp命令,回车,输入要拷贝文件的文件名,回车,输入要拷贝到哪个路径下面, 即会在该路径下创建一个名为与被拷贝文件名相同的数据文件 (目录文件) , 并且指向盘块里面的内容都相同的数据文件 (目录文件) 。 在该拷贝过程中要判断该目录中是否存在该文件, 如果不存在就没有必要执行该操作了, 还要判断在该目录下有

16、没有拷贝文件的权限, 有权限才可以拷贝。 然后要查看该路径是否存在, 存在该路径才可以在该路径下创建拷贝过来的文件,具体流程图查看第二节,系统流程图设计部分。 cat显示文件内容模块,输入 cat命令,回车,输入文件名,回车,即会在屏幕上显示该文件的具体内容。 在该过程中要判断该目录中是否存在该文件, 如果不存在就没有必要执行该操作了。 执行操作时, 要调用 readfile ( INode inode ) 函数 , 先读入文件内容到 content里面,然后直接输出。具体流程图查看第二节,系统流程图设计部分。 ls显示当前目录下所有目录的模块,输入 ls命令,回车,即会在屏幕上显示当前目录下

17、的所有目录。 在该过程中要判断该目录中是否为空, 如果为空就没有必要执行该操作了。执行操作时,要调用 readdir ( INode inode )函数 , 先读入文件内容到 content 里面,然后直接输出。 如果子目录里面还有子目录, 则通过递归, 一并输出来。 具体流程图查看第二节,系统流程图设计部分。 pwd显示当前目录的模块,输入pwd命令,回车,即会在屏幕上显示当前所在的目录。 vi写文件操作模块,输入 vi命令,回车,输入文件名,回车,既可以选择自己输入内容还是系统自动输入, 选择自己输入的话, 可以自己主动随便输入什么内容然后回车。 如果选择系统自动输入, 那么还需要输入要填

18、充的字符个数, 系统就会自动填充。 具体流程图查看第二节,系统流程图设计部分。 chmod改变文件权限模块,输入 chmod命令,回车,输入文件名,回车,即会根据不同类别的用户在屏幕上提示要改变哪一类用户的权限。 如果是文件拥有者执行该操作, 他可以选择修改自己、 其他用户的权限; 如果是文件所属组成员执行该操作, 他可以选择修改自己、其他用户的权限;如果是其他用户执行该操作,他只能选择修改自己的权限; 在该过程中要判断该目录中是否存在该文件, 如果不存在就没有必要执行该操作了。 执行操作时, 要判断对该文件有没有执行写操作的权利, 没有就不能进行。 具体流程图查看第二节, 系统流程图设计部分

19、。 chown改变文件所有者模块,输入 chown命令,回车,输入文件名,回车,就会判断执行者对于该文件有没有改变的权限, 没有的话就不能执行, 还有判断当前目录下有没有该文件, 没有的话就没有必要执行该操作。 判断可以执行时, 就会提示输入改变以后的所有者,然后判断输入的用户名的合法性,判断合法则修改成功。 (如果修改的文件时目录文件,则将它下面的文件全部一起改了)具体流程图查看第二节,系统流程图设计部分。 chgrp改变文件所属组模块,输入 chgrp命令,回车,输入文件名,回车,就会判断执行者对于该文件有没有改变的权限, 没有的话就不能执行, 还有判断当前目录下有没有该文件, 没有的话就

20、没有必要执行该操作。 判断可以执行时, 就会提示输入改变以后的所属组,然后判断输入的组名的合法性,判断合法则修改成功。 (如果修改的文件时目录文件,则将它下面的文件全部一起改了)具体流程图查看第二节,系统流程图设计部分。 MV变文件名模块,输入MV命令,回车,输入文件名,回车,就会判断执行者对于该文件有没有改变的权限,没有的话就不能执行, 还有判断当前目录下有没有该文件,没有的话就没有必要执行该操作。判断可以执行时,就会提示输入改变以后的文件名,然后判断输入文件名是否与当前目录下有重名的,判断没有重名则修改成功。 具体流程图查看第二节,系统流程图设计部分。 ln建立文件联接*II块,输入 ln

21、命令,回车,输入要建立联接文件的文件名,回车, 输入要连接到哪个文件的文件名,即会在该路径下创建一个以此命名的数据文件,并且该文件名后面的I结点号与前面一个文件的I结点号相同,指向相同的盘块。在该过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有拷贝文件的权限,有权限才可以拷贝。然后要查看该文件的重名是否存在,存在则建立联接失败,具体流程图查看第二节,系统流程图设计部分。 ls-l显示文件类型模块,输入 MV命令,回车,输入文件名,回车,则会在屏幕上输 出该文件的类型是目录文件还是数据文件。 cd改变当前所在目录的模块。输入cd,回车,相应的字符串,

22、回车,则会根据输入字符串的不同跳转到不同的目录下。如果字符串是.,则到当前目录;如果字符串是.,则到父目录;如果字符串是/,则到根目录;如果字符串是当前目录下的子目录,则到该 子目录;如果字符串是一个决定路径,则到该绝对路径。当然在执行的时候要判断有没有该子目录或者该绝对路径,如果没有的话,就不能执行。具体流程图查看第二节,系统流程图设计部分。2.用户操作 login用户注销模块,输入login ,回车,当前用户就退出了,需要重新登录。 passwd用户修改口令模块,输入 passwd,回车,则会提示输入原始密码,输入正确 了才可以提示输入新密码,并且要求新密码输入两次,两次一样了才能通过修改

23、密码成功。 具体流程图查看第二节,系统流程图设计部分。 umask用户查看umask码模块,输入umask,回车,屏幕上就会显示当前用户的用户 umask 码。 Umask用户彳改umask码模块,输入 Umask,回车,输入新的 umask码,回车,既可 以更新原有的用户屏蔽码。 logout用户退出系统模块,输入 logout ,回车,系统自动退出。 help用户寻求帮助模块,当用户不清楚执行命令的时候,可以输入help ,回车,屏幕上会显示出各种命令语句。五、实验演示1 .初始化磁盘块超级块与I结点初始化结果截图:6 1 8 2351 4 6O2 2 2 42 4691131 46281

24、 O 24 607 1 2 工913 66 9 1 s O1 3 6S1798 3 51416 83 57 3 1 1ST352 6 14 6 1 3 5113 553 5 1O1243 54 912 102 -3 579 1 12568 0 12 5757 912 4746SO2 473579Z4,624 6824613 572461一 2 461 2 46成组连接法每10个盘块一组,最后一组只有 7个,空闲盘块截图:di5k.txt - 记事本立坤旧 海期同 T&式(6 亘苕(V) 拓时(H23 24 252627 2S 29 30 3.132 10di sk.txt - 1 己事本文件(

25、F)啊辐(曰 TSiC(O) 兰否(VD用回1(H)193 194 195 196 197 198 1992 .用户登录直接登录:WWumascodeumas注册root 查看用户 修改用户heIp renter logoutenter JInLehteiJ file! eoter FHb2 tenterchgrptenteF f1lelenteF MUenter lie CenteF logini Center passferdEenter umas ikEentei UmaskCenter code(enterLogin: wmq passed= 123 logfin success注册登

26、录:io* wmqswd: 123login success件File的类别Filelcnter?1:注册2:登陆唔卑事肋 德用素统杳tl“碎配34码 gIne12密阳12密新不:新叫用 :w使e缺新3 312请册 注陆 登肖? fe 霁新 14 Dt号否 o4iwd入码码入屋 户已户M帝密输la 用名用患功 AJ户入入一费一施 输用篝再次输再册 主闫亥主用重同海主局主同主3 .目录操作 新建目录:解座蠲 入用户名:nene 入新隹码:1234 一东输入新密码成功logins 1234success:NMMMWMyeleone n&nerootmkdiraa国录已成功创建rootnkdipbb

27、目录已成功创建root 新建以后可以看到盘块中已存在这两个目录:这两个目录的i结点分配情况:di- - 记寺本文件 g唱式 sorvi 都助 1H)36113022:40:4400dr47KTWzr-K 22:40: 41a dm cbrwxTwxix 22 :4001444wnq 015adin drTranrwicrwx0 nenea dm0000 nene删除目录:umasCDdelentepJfilelenter file2(enter71:注册2:登陆堂翼窜墨霸承ter fileenter teren论删除 C:UwAAdminkt。八D”kt叩楔作塞能让型实盥底件基混pebug值件

28、基编小名码人 户的福1 改用户umas181 13022:42:420drwsrwxr-x 22:40:4411500000 nene adm删除操作以后目录中 aa目录项已经被删除:disk.txt -记事本文件的 筋的 格式 专看m 簿am000 vnrqa dm drwxrwirwx删除操作以后aa文件的i结点结点也被回收:改变当前路径:复制目录文件:此时bb目录以及它下面的目录 cc, 一并拷贝到aa目录下面了:-J-F) 石帝i三:咯芝(O: 亘三(Vj 费的CT .bb 2aa 1l-l Ibb 4cc 3cc显示当前目录:6口呢喀配曰1武源叫0叩谶cdFoot/bb已切换到该目录

29、root/bhcd巨切排到X目录 r 口口 tXkdiraa目录已成功创建rootledbb已切换到子目录Fout/JbbmkdiFCC目录已成功创建P0Dt/bbcd巨切换到父目录1ODt c p bbroot/aaB录已成功创建文件拷贝完毕 rootpwd 假的当前目录为,3 root_显示当前目录下的所有文件目录:CUse rsAd mini stratorD eskto陛至统状型实验出件萦婚口 e bug文件至统,exei*ddI nkdlfbb目录已成功创建root cdbb已切换到子目录ro d t zhbmJcd士切换到根目录root cpbbroot/aa目录已成功创建文件拷贝

30、完毕显毕FOOt 改变目录名:nenedridi*wx!*wxr-x19:Bl:B5aa18neneadndrwxrwxr-x19:Ml:25bb18neneadndiwxrwxr-x19:01:25cc0nene旗dmdrwxrwxr-x19:01 :Kbb18neneddmdrwxrwxr-x19;01:05HneheAdridi*wX!*wXr-X19:01:esroot ls改变目录名以后可以看到磁盘中aa已经变成了 bc:改变目录权限:改变目录拥有者:改变目录所属组:查看文件类别:4 .文件操作新建文件新建文件以后磁盘中已经有这两个文件:删除文件望舞高热霸连结改codeInentei

31、 flleKentei* file2Ceotei*:是否为新用户? L注册2:登陆Is entei chmoilCentep chown Center cligitpCentepls-1enter filetenter1Die Ip Lenter J logoutenterJf ilelentei f iletenter1 ilpCcntei?MU Centerl f ile tenterl logintentep passudCenter unnsktenceF Umasktentep codeCenterJ统查看用户uma总k 修改用户umak改变当前目录下名为in文件nw代件成功删除 l

32、*QOtrootrn洋名UMLogriim : nenepassyd: 1234login success MMMwwMyeleone nenekxmmhx变当前目录下名为以他文住 变当的目录下名力1c文此改变当前目录下名为门址文件 用户汪鼠可以翰登陆 用力改变密码执行删除操作以后磁盘中文件已经删除:写文件istratorD日5kte p娓柞系筑般忙案舶大SI实聆文件录微De bugT文件案统一ewUmaskCenteFJ Cod已lente产cadeuvnasunas邙口式与Ie2建立连结 葡旷的簿Inentepl filel(enter file2enterIs-1tenter filee

33、nter he IpLentep logoutenter是否为新用户? L注册其他,登陆2Logrin: wnqpasswd: 123loin success kkmmmmUelcQlie vmqkhhxxh root文件三.成功创建FOOtwiFF请选择直接填充或自己写入内容: 1:手动写入内容I其他:演示二次间址实现 1mkakkmk文件成功写入poot/FrO disk.txt -记事本文件旧编急(E)格式(0) O(V)帮助(H)inkinkkinkC:UsersAdministratorDesktop或作至於搔作至宓大型实软文件至然Debug、文件系统.exB L一passwd: 1

34、23login success xdMJe 1c o ne wnq* rootnki*r文件已成功创建rootui1*1*请选择直按填充或自己写入内容:手动写入内容;其他:演示二次间址实现1mkmkknk文件成功写入root/rrcd已切换到根目录rootuirr请选择直接填充或自己写入内容:i:手动写入内容;其他:演示二次间址实现陛鬻例字符数:68096root/rrkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk _ kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

35、kkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkk

36、kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

37、kkkkkkkkkk kkkkkkkkklddckkkkkkkkkkkkkkkldtkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkI kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk .拷贝文件rootmk文件成功写入root/aAcdroot ,目录已成功创建 root wiaa文件己成功创建root imkdirLogfio : wmqpas

38、sed: 123login success mkh禀篝Jelcome wmo*已切换到根目录rontcpaarouthh观焦融包建文件成功写入查看文件建立文件联接可以看到此时存在一个 ce文件与aa虽然文件名不同,但是指向的是同一个 I结点,相当于一个文件有两个名称。修改文件权限、文件拥有者、文件所属组与前面的目录操作是相同的,这里不再重复演示。六、重要函数及其实现方法bool havesameChar *dirname,INode inode, int &i, int &index2)函数主要用于判断文件在当前路 径下是否存在,输入文件名,当前路径目录文件的节点号inode ,就可以通过in

39、ode节点中的addr定位到该目录文件,然后通过一个个查找,与 dirname对比,找到相等的,就说明该目 录文件中有该文件,可以对它进行操作。该函数在整个程序的功能实现中都会用到,因为每进行一个文件操作,首先要判断它是否存在,只有存在该文件才可以对它进行一定的操作。bool find(char *string )函数同样是贯穿于整个程序,它的主要功能是找到string指明的路径,并且转换当前路径到该路径下,查找的过程主要是按照路径一个目录一个目录往下查找,每查找一个目录都是通过调用havesame函数实现的。该函数在很多功能中都会用到,比如说将一个指定文件拷贝到指定路径下,就要通过该函数先确

40、定该路径是否存在,并且转换到该路径下。int balloc()函数用于申请新盘块,因为磁盘所有盘块都是通过成组链接法管理的,在该函数中每申请一个盘块的时候都会检查有没有到栈底,如果是栈底了,就必须先把栈底盘块里面存放的下一组盘块号调入栈中,然后把该盘块分配出去。void bfree(int index)函数与申请盘块的函数相对应, 它是用于指定盘块的回收的, 同样的, 为了实现成组链接法,当一个盘块回收时,必须先检查盘块号栈是否已满,如果已满,则先把栈里面的盘块号全部都写入要回收的盘块中,然后清空栈,把刚刚回收的盘块号写入栈底。void rmdir(char *dirname, int ind

41、ex)该函数主要用于删除指定目录,删除目录时主要考虑的 问题是该目录下面的子目录是不是也要删除了?要怎样实现?所以该函数中我要运用了递 归的方法,删除该目录的时候先检查他下面是否有子目录,然后对每一个子目录执行该函数,如此循环,直到它为空目录了才将目录删除。同样的在修改目录拥有者函数void chown(char*name),目录所属组函数void chgrp(char *name)中我也运用了同样的方法来实现该目录下面子 目录文件,目录的拥有者、所属组修改。void writefile(INode inode, int in)该函数为文件写函数,该函数的实现也是比较复杂的,首 先要调用读文件

42、的函数 void readfile(INode inode)读入该文件原先的内容,将原先的内容与新写 入的内容进行比较,如果原先内容多,那么先将多余的盘块回收了,然后将内容写入。如果新写入的内容多,那么说明盘块不够,需要申请盘块,在申请盘块的过程中每申请一个盘块之前都要先判断原先内容有没有写到这一块, 如果没有则进行申请, 否则不用申请。 盘块申请完以后就可以将内容写入了。其他比较简单的功能实现函数由于代码比较多, 而且具体功能在模块详解以及系统流程设计的流程图中都有很详细的说明, 这里就不再解释了, 而且附上的源代码文件里面都已经写了很详细的注释,这里就不占篇幅了。七、实验心得体会1. 调试

43、中遇到的问题总结本次实验中主要遇到的问题及解决方案: 写入文件的时候因为分配盘块用的是成组连接法,当读到一组里面最后一个盘块的时候需要从该盘块中读入下一组盘块号进入栈, 每次运行到分配盘块的时候总是出错, 分配前面几组都是正确的, 但是到某一组就是读不进来下一组的盘块号, 当时是设了断点一步步调试,还用写入的方法测试了下位置对不对,结果写入的位置是正确的, 然后就郁闷了, 不知道怎么回事, 后来发现了一到读三位数的就不正确了, 因为在盘块里面我初始化的时候, 写 入的都是每个盘块号只占了三个字节, 所以三位数都是黏在一起的, 中间没有空格, 在读入 的时候就不会读入一个个数,而是一长串数字,导

44、致出错。 调试过程中最郁闷的事就是文件的打开关闭了。刚开始没有注意这些问题,根本就没有注意文件的重复打开问题,导致在这个函数里面打开了 disk.txt 文件,还没有关闭,接下需要调用另外一个函数, 文件又在另外一个函数里面被打开, 结果在另一个文件里面就根本读不进文件里面的数据, 因为这个毛病刚开始的时候出现了很多奇怪的现象, 比如说在创建文件的函数里面,每创建一个函数申请一个盘块,就算申请了好几十个盘块都没有问题。但是同样申请盘块在文件的写函数里就实现不了,因为在写函数里面我已经打开了disk.txt 文件, 而在盘块申请函数里面又打开了 disk.txt 文件。 本来是想每申请一个盘块,

45、就先把内容写进去, 实现边申请边写, 结果申请到下一组的盘块就会出错, 因为下一组的盘块根本没有读进栈。 技术性的问题也有,就是刚开始很多地方都是打算用string类型的数来传递值的,结果 cout 还有很多 string 类型自带的函数根本就不支持。查看了头文件确实已经包括了 , 后来终于还是百度了这个问题, 然后发现百度上的解答也是要求要包含string类型的头文件, 刚开始还不得解。 然后无意间发现好像应该是 。 然后就真的可以了。 在递归函数的实现上也碰到了问题,因为我是想目录文件删除的时候,如果它包含了子目录,那么通过递归, 把它下面的子目录先删除了,等文件为空了再删除该目录。结果我

46、在删完第一个子目录的时候再返回删除第二个子目录的时候就出错了,最后发现还是disk.txt 的关闭问题,因为我在递归之前并没有关闭 disk.txt 文件,所以在调用递归的时候,进入了这个函数又重复打开了该文件。 刚开始在设计ls()函数的时候没有考虑到子目录的问题,只是简单地想列出当前目录下的所有目录项, 而没有想把这些子目录项中的子目录也一起列出来, 最后也是通过了递归读入目录项,实现了这个功能。 在写创建用户umask码的时候理解这个东西还是挺困难的,刚开始真的不理解,于是就直接用w、 r 来代替了, 虽然说用户屏蔽码最后就是用来计算权限的, 但是经过读懂之后,还是不厌其烦的改动了整个程

47、序, 增加了一个用户类。 全局变量里面设定了系统屏蔽码, 用户屏蔽码就写在了用户的类里面,每个用户都自带自己的用户umask 码。2. 实验感悟本次试验最大的体会就是个人工作与小组工作的差别, 这次实验我选择了个人独立来完成, 主要是想体验一下一个人独立完成一个完整的程序的感受。 刚开始的时候我认真去看了第六章的上课PPT,然后还仔细翻看了书本上的内容。因为一开始对于各种概念都很模糊,不明白具体的应用, 所以我可以说是花了一个星期的时间专门去理解了关于如何用成组连接法实现空盘块的管理, 以及 i 结点的概念, 超级块应该如何设计, 文件目录的管理等等内容,理解了这些内容以后, 我就开始着手设计

48、程序的每个功能实现流程, 觉得理解了各种概念以后, 编写程序应该会比较轻松了。 结果并不是我想象得那么简单, 我花了整整一个多星期不说, 每天晚上还熬夜到差不多 1 点多, 因为代码不是说你怎么想的它就真的按照你的想法去实现, 它的逻辑要比人脑严谨得多。 哪怕出现一点点错误它就会运行错误, 而且是一些莫名其妙的错误,比如说一个函数中定义了两个局部变量inode1 、 inode2 ,在运用的时候可能不小心把 inode1 错写成了 inode2 ,那么整个函数的运行就出错了,然后是你怎么也想象不到的错误。 只能够通过一步步断点调试, 看每一步的变量情况才会发现这种错误。 所以说就算是一个很简单

49、的函数实现, 都有可能要花很漫长的时间来调试, 这的确是一种考验耐心的活。说实话中途的时候还真的想放弃了,觉得找个小伙伴一起就可以两个人一起分担工作,不会这么累了。 后来想想都已经自己一个人写到这个程度了, 为什么还不坚持坚持呢。 所以我还是毅然得决定一个人继续了,总算功夫深,还是完成了,这种喜悦真的说不上来。总之我觉得一个人做实验,虽然累了点,但是,整个过程处处都要靠自己去理解,从unix 系统文件管理各种功能的理解,功能的流程设计,代码的实现以及最后报告的编写。所以整个流程下来理解的知识要更多更深刻, 学到的肯定是要比别人多的。 整个程序十几个函数,每一个函数都要自己亲自去调试,每一个功能

50、都要靠一步步调试去不断地改正实现。不是说写了就可以成功了,有些功能真的是出错的时候调试仅仅几行代码都要花上半天时间。 程序不说, 就拿实验报告来说还是花了一整天的时间来写的, 光画十几个流程图也用了一个上午的时间。 第一次验收的时候报告还有各种格式的错误, 又重新改了一遍, 截图也全部重新截了, 而且在实验结果截图的时候又会发现一些小问题, 老师对于我的写文件的功能的实现又提出了建议, 然后我又返回来调试。 增加了文件编辑功能, 根据写入文件内容的大小来分配一定数量的盘块, 重新写入文件内容以后可以根据文件原本的内容多少来合理的分配盘块,比如说新写入的内容需要的盘块数目比原来少, 那么就回收多余的盘块, 相反,如果新写入的文件内容需要的盘块数目比原来多, 那么就要分配需要的多出来的盘块。 在实现这两个功能的时候, 着实下了点功夫, 因为从哪一部分开始要申请盘块了真的很难判断, 最后我想出来了可以把现在要申请盘块的内容与原本文件内容的最大值比较,如果大于它了,那么说明接下来肯定是盘块数不够了, 需要申请新的盘块。 所以本来以为最多一个星期就可以完成的任务, 结果却反反复复得修改程序代码, 实验报告, 最后总算还是完成了。现在感觉不论是对操作系统这门课的理解, 还是对一个程序员的编写者的感悟, 或者是对于一份报告的编写,都学到了很多新的知识。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!