操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計報告--后附源代碼

上傳人:每**** 文檔編號:46375721 上傳時間:2021-12-13 格式:DOC 頁數(shù):44 大小:389.50KB
收藏 版權(quán)申訴 舉報 下載
操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計報告--后附源代碼_第1頁
第1頁 / 共44頁
操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計報告--后附源代碼_第2頁
第2頁 / 共44頁
操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計報告--后附源代碼_第3頁
第3頁 / 共44頁

下載文檔到電腦,查找使用更方便

25 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計報告--后附源代碼》由會員分享,可在線閱讀,更多相關(guān)《操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計報告--后附源代碼(44頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 計算機操作系統(tǒng) 課程設(shè)計報告 設(shè)計項目名稱: 文件系統(tǒng)設(shè)計 專 業(yè): 網(wǎng)絡(luò)工程 班 級: 201001 學(xué) 號: 201026340117;201026340121 姓 名: 張世波 趙流男 指 導(dǎo) 教 師: 張 瑞 紅 請預(yù)覽后下載! 目錄

2、 1 課程設(shè)計簡介 1 1.1 課程設(shè)計的目的 1 1.2 課程設(shè)計內(nèi)容 1 2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計 2 2.1 預(yù)定義 2 2.2 結(jié)構(gòu)體 2 2.3 全局變量和函數(shù) 2 3 功能模塊(或算法)描述 3 3.1 模塊劃分 4 3.2 模塊流程圖 6 4 程序運行結(jié)果 4 5心得體會 5 參考文獻 6 附源代碼 7 請預(yù)覽后下載! 1 課程設(shè)計簡介 1.1 課程設(shè)計的目的 課程設(shè)計目的使學(xué)生熟悉文件管理系統(tǒng)的設(shè)計方法;加深對所學(xué)各種文件操作的了解及其操作方法的特點。通過模擬文件系統(tǒng)的實現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識, 加深對教

3、材中的重要算法的理解。同時通過編程實現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,提高綜合運用各專業(yè)課知識的能力。 1.2 課程設(shè)計內(nèi)容 課程設(shè)計內(nèi)容設(shè)計一個簡單的多用戶文件系統(tǒng)。即 ①在系統(tǒng)中用一個文件來模擬一個磁盤; ②此系統(tǒng)至少有:Create、delete、open、close、read、write等和部分文件屬性的功能。 ③實現(xiàn)這個文件系統(tǒng)。 ④能實際演示這個文件系統(tǒng)?;旧鲜沁M入一個界面(此界面就是該文件系統(tǒng)的界面)后,可以實現(xiàn)設(shè)計的操作要求。 1)設(shè)計一個10個用戶的文件系統(tǒng),每次用戶可保存10個文件,一次運行用戶可以打開5個文件。 2)程序采用二級文件目錄

4、(即設(shè)置主目錄MFD)和用戶文件目錄(UFD)。另外,為打開文件設(shè)置了運行文件目錄(AFD)。 3)為了便于實現(xiàn),對文件的讀寫作了簡化,在執(zhí)行讀寫命令時,只需改讀寫指針,并不進行實際的讀寫操作。 4)因系統(tǒng)小,文件目錄的檢索使用了簡單的線性搜索。 5)文件保護簡單使用了三位保護碼:允許讀寫執(zhí)行、對應(yīng)位為1,對應(yīng)位為0,則表示不允許讀寫、執(zhí)行。 6)程序中使用的主要設(shè)計結(jié)構(gòu)如下:主文件目錄和用戶文件目錄(MFD、UFD),打開文件目錄(AFD)即運行文件目錄,如圖5.1所示。 請預(yù)覽后下載! 2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計 2.1 預(yù)定義 #define BLOCKSIZ

5、 512 //磁盤塊的大小 #define DATABLKNUM 512 //數(shù)據(jù)塊的數(shù)目 #define BLKGRUPNUM 50 //數(shù)據(jù)塊組包含多少數(shù)據(jù)塊 #define P_N_BLOCKS 15 //inode節(jié)點中 指向數(shù)據(jù)塊的指針個數(shù) #define GROUPNUM DATABLKNUM/BLKGRUPNUM+1 //數(shù)據(jù)塊組 組數(shù) #define DINODESIZ 512 //磁盤i結(jié)點區(qū)的大?。臻g32512) #define DINODENUM 32 //磁盤i結(jié)點區(qū)的塊數(shù) #define SYSOPENFILE 40

6、 #define DIRNUM 32 //一個目錄下的最多目錄和文件的總和數(shù) #define DIRSIZ 14 //文件、目錄名的長度(字節(jié)) #define UPWDSIZ 15 //密碼的長度 #define UNAMSIZ 15 //用戶名的長度 #define PWDSIZ sizeof(struct pwd) //密碼結(jié)構(gòu)的長度 #define PWDNUM BLOCKSIZ/PWDSIZ //密碼數(shù)據(jù)空間的大?。╬wd為單位) #define NOFILE 20 //一個用戶最多可以

7、打開的文件數(shù)目 #define DINODESTART 4*BLOCKSIZ //i結(jié)點區(qū)的開始地址-inodes table ,1引導(dǎo) 2超塊 3block bitmap 4inode bitmap #define DATASTART (2+DINODENUM)*BLOCKSIZ //數(shù)據(jù)區(qū)的開始地址 #define DATASTARTNO 36 //數(shù)據(jù)區(qū)開始指針 #define DIMODE_EMPTY 00000/*可以用的空間*/ #define DIMODE_FILE 00001 #define DIMODE_DIR 00002 #d

8、efine DIMODE_PASSWD 00004 #define GRUP_0 0 //管理員組 #define GRUP_1 1 #define GRUP_2 2 #define GRUP_4 4 2.2 結(jié)構(gòu)體 //磁盤i結(jié)點結(jié)構(gòu), struct inode{ // char di_name[DIRSIZ]; 請預(yù)覽后下載! unsigned __int16 di_ino; /*磁盤i節(jié)點標(biāo)識*/ unsigned __int16 di_number; /*關(guān)聯(lián)文件數(shù),當(dāng)為0時表示刪除文件*/

9、 unsigned __int16 di_mode; /*存取權(quán)限*/ unsigned __int16 di_uid; /*磁盤i節(jié)點用戶id*/ unsigned __int16 di_gid; /*磁盤i節(jié)點權(quán)限組id*/ //1管理員組 2用戶組 unsigned __int32 di_size; /*文件大小*/ unsigned __int32 di_ctime; /* Creation time */ unsigned __int32 di_mtime; /* Modification time */

10、 unsigned __int16 di_block[P_N_BLOCKS]; /* 一組 block 指針 */ }; // 目錄項結(jié)構(gòu) struct direct{ char d_name[DIRSIZ]; /*目錄名(14字節(jié))*/ __int16 d_ino; /*目錄號*/ }; //超級快結(jié)構(gòu) struct super_block{ unsigned __int16 s_inodes_count; /* inodes 計數(shù) */ unsigned __int16 s_blocks_count; /*

11、 blocks 計數(shù) */ unsigned __int16 s_r_blocks_count; /* 保留的 blocks 計數(shù) */ unsigned __int16 s_free_blocks_count; // 空閑的 blocks 計數(shù) unsigned __int16 s_free_inodes_count; /* 空閑的 inodes 計數(shù) */ unsigned __int16 s_free_blocks_group[GROUPNUM];//新增 一個數(shù)組來記錄每個數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計數(shù) unsigned __int16 s_firs

12、t_data_block; /* 第一個數(shù)據(jù) block */ unsigned __int16 s_log_block_size; /* block 的大小 */ unsigned __int16 s_blocks_per_group; /* 每 block group 的 block 數(shù)量 */ unsigned __int16 s_inodes_per_group; /* 每 block group 的 inode 數(shù)量 */ }; // 用戶密碼 struct pwd{ unsigned __int8 p_uid; unsigne

13、d __int8 p_gid; char username[UNAMSIZ];/*用戶名 新加的*/ char password[UPWDSIZ]; }; // 目錄結(jié)構(gòu) struct dir{ struct direct direct[DIRNUM]; __int16 size; }; 請預(yù)覽后下載! 2.3 全局變量和函數(shù) // 全局變量 unsigned __int8 di_bitmap[DINODENUM]; // 硬盤inode節(jié)點位圖1表示已使用 0表示未使用 unsigned __int8 bk_bitmap[DAT

14、ABLKNUM]; // 數(shù)據(jù)塊block位圖 struct super_block filsys; //超級塊 struct pwd pwd[PWDNUM]; FILE *fd; //文件指針 struct inode *cur_inode; //i節(jié)點當(dāng)前目錄指針 struct inode *inodetemp; //i節(jié)點指針 const char fsystemname[20]="Linux.EXT2"; //模擬硬盤的文件名 struct direct dir_buf[BLOCKSIZ / sizeof(struct direc

15、t)]; //目錄數(shù)組 char cmdhead[20];//cmd 的頭 表示所在哪個文件夾 、 int i_lock=0;//inode位圖鎖 可能會多線程 int b_lock=0;//block位圖鎖 struct pwd *cur_user; /* 全局函數(shù) */ extern int Format();//格式化磁盤 extern int Install();//啟動,安裝文件系統(tǒng) struct inode * read_inode(int);//install里面讀取文件dinode struct direct * read_dir_data(int);/

16、/讀取存儲文件夾的物理塊 extern void showdir();//命令 dir int Enterdir(char[]);//進入某個文件夾 命令-- cd 文件名 int Fd_dirfile(char[]);//查找當(dāng)前目錄里的文件 沒找到返回-1 找到返回inode號 int Iscmd(char[]);//判斷是否兩個字符串的命令 void two_cmd(char[],char[]);//兩個字符串的命令 int creat(char[]);//創(chuàng)建文件 void changeinode();//交換指針 char * ReadFile(char[]);//

17、讀取文件 int mkdir(char[]);//創(chuàng)建文件夾 void showbitmap();//顯示位圖 int deletefd(char[]);//刪除文件 int editfile(char[]);//編輯文件 int rename(char[]);//重命名 void showhelp();//命令幫助 void login(); void logout(); int access();//權(quán)限判斷 /*磁盤i節(jié)點的分配與釋放(當(dāng)一個新文件被建立的時候,在給該文件分配磁盤存儲區(qū)之前, 應(yīng)為該文件分配存放該文件說明信息的磁盤i節(jié)點,當(dāng)從文件系統(tǒng)中刪除某個文件時

18、, 應(yīng)首先刪除它的磁盤i節(jié)點項。)*/ int ialloc();/*開辟一個空閑的i節(jié)點,返回i節(jié)點*///磁盤塊分配與釋放函數(shù) int balloc(int);//申請硬盤空間 請預(yù)覽后下載! 結(jié)構(gòu)體說明: 硬盤模擬文件:每個數(shù)據(jù)塊512字節(jié),第一個數(shù)據(jù)塊空閑備用,第2塊是超級塊,第3塊是inode位圖,第4塊是block位圖,第5塊開始有32塊是inode節(jié)點,然后是數(shù)據(jù)區(qū)block,512塊。 超級塊:存放整個文件系統(tǒng)的基本狀態(tài),如:inode塊數(shù),block總塊數(shù),空閑的block計數(shù),空閑的inode計數(shù),每個數(shù)據(jù)塊組中的空閑塊數(shù)(為block分組,便于

19、讀?。總€block的大?。?12字節(jié)),每個數(shù)據(jù)塊組的block塊數(shù)。 Inode位圖:用一個數(shù)組來描述每個inode的使用狀況,1表示被占用,0表示空閑。 Block位圖:用一個數(shù)組來描述每個數(shù)據(jù)區(qū)的block的使用狀況,1表示被占用,0表示空閑。 inode節(jié)點:inode記錄了文件或者目錄在數(shù)據(jù)區(qū)存放位置,是文件還是目錄,是否系統(tǒng)文件,屬于管理員組還是普通用戶組,是由誰創(chuàng)建的,創(chuàng)建時間等。如果是目錄,則還記錄了里面包含多少個文件或子目錄。是文件則記錄了文件的大小。讀取文件要先通過inode然后找到block,才能讀取。 Block數(shù)據(jù)塊:存放文件的地方,如果是目錄則記錄了這個

20、目錄下所有的文件和子目錄的名稱和所占的inode 如果是文本文檔,則是字節(jié)流文件。 3 功能模塊(或算法)描述 我負(fù)責(zé)整體設(shè)計,實現(xiàn)底層具體設(shè)計,format格式化,install安裝,login登錄,ialloc申請inode空間,balloc申請block空間。 3.1 format 格式化 只寫打開模擬文件,初始化超級快,初始化dinode位圖 block位圖,初始化主目錄,初始化etc目錄,初始化管理員admin 目錄,初始化用戶xiao 目錄,初始化 用戶passwd文件,寫入模擬硬盤文件。 3.2 install 安裝 讀寫打開模擬文件,讀取dinode位圖 b

21、lock位圖,讀取主目錄,讀取etc目錄,讀取管理員admin 目錄,讀取用戶xiao 目錄,讀取 用戶passwd文件。 3.3 login 登陸 用戶輸入用戶名和密碼,在passwd文件中查找是否有此用戶,核對密碼。正確則登陸成功,當(dāng)前目錄設(shè)定到當(dāng)前用戶文件夾下。登錄流程圖 3.4 ialloc 申請inode空間 先檢測inode位圖是否加鎖,是則退出。加鎖,檢測inode空間是否還有已滿,是則退出。在inode位圖中順序查找空閑的inode,找到則返回inode地址,block解鎖。函數(shù)結(jié)束。流程圖3.3 請預(yù)覽后下載! 登錄流程圖 ialloc 流程圖

22、3.3 balloc流程圖3.4 3.5 balloc 申請block空間 先檢測block位圖是否加鎖,是則退出。加鎖,檢測block空間是否還有k個空閑,否則退出。在還有空閑block的組中查找是否有k個空閑,沒有則去下一個block組中查找,找到則返回block地址,block解鎖。函數(shù)結(jié)束。流程圖3.4 3.5 create 創(chuàng)建文本文件 查找當(dāng)前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi)容,以‘###’結(jié)束。申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結(jié)束。將文件內(nèi)容寫入inode空間和block空間

23、。修改當(dāng)前目錄的結(jié)構(gòu),修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。流程圖3.5 3.7 cdir 創(chuàng)建文件夾 查找當(dāng)前目錄下是否有同名文件,是則退出,否則,申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結(jié)束。將文件夾內(nèi)容寫入inode空間和block空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。 3.7 read edit –讀取和追加文本文件 Read----查找當(dāng)前目錄下是否該文件,沒有則退出,否則調(diào)用access()權(quán)限判斷,有權(quán)限則判斷是不是文件,不是則退出,是文件則讀取

24、文件并顯示。 Edit----調(diào)用讀取文件模塊,讀取成功則用戶輸入追加的內(nèi)容,如果追加的內(nèi)容大于一個block則申請block空間,失敗則退出,申請成功則保存文件。 3.8 access(文件名) 權(quán)限判斷 先判斷當(dāng)前目錄是否有該文件,在當(dāng)前目錄的block找到該文件,判斷當(dāng)前登錄用戶是哪個組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級別。 請預(yù)覽后下載! 如果是該用戶創(chuàng)建的 則有讀寫權(quán)限如果當(dāng)前用戶是管理員組的 也具有讀寫權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。 3.9 cd –進入子目錄 或上級目錄 查找當(dāng)前目錄是否有該子目錄,沒有則退出,調(diào)用access()判斷當(dāng)前用戶

25、是否有權(quán)限,無則退出,有則讀取該子目錄的inode,將當(dāng)前目錄指向該目錄。 3.10 attr(文件名)查看文件或者文件夾的屬性 先查找當(dāng)前目錄下是否有該文件或目錄,有則判斷文件是否系統(tǒng)文件,是否文本文件,是否目錄,由誰創(chuàng)建,屬于什么組,占用的block,和inode。將其全部顯示出來。 3.9 del 刪除文件或目錄 查找當(dāng)前目錄是否有該文件名,沒有則退出,有則調(diào)用access()判斷是否有權(quán)限,有則判斷是否為系統(tǒng)文件,是則無法刪除,不是則判斷是否是文件,是文件則直接刪除,不是則判斷是否文件夾,是文件夾則判斷該文件夾下是否有文件,有文件則無法刪除。提示用戶是否刪除,確認(rèn)則刪除文件,修

26、改當(dāng)前文件夾inode,block結(jié)構(gòu),修改該文件占有的inode和block位圖為0,修改超級塊,寫入模擬硬盤。流程圖3.9 3.8 access(文件名) 權(quán)限判斷 先判斷當(dāng)前目錄是否有該文件,在當(dāng)前目錄的block找到該文件,判斷當(dāng)前登錄用戶是哪個組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級別。 如果是該用戶創(chuàng)建的 則有讀寫權(quán)限如果當(dāng)前用戶是管理員組的 也具有讀寫權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。 請預(yù)覽后下載! 4 程序運行結(jié)果 1格式化 和登錄界面 登錄后顯示幫助信息 ,進入到用戶文件夾下 2 di

27、r命令---顯示當(dāng)前目錄下的文件和目錄 3 logout命令---注銷用戶 請預(yù)覽后下載! 普通用戶無法進入admin管理員目錄。 請預(yù)覽后下載! 5心得體會 操作系統(tǒng)課程設(shè)計是本課程重要的實踐教學(xué)環(huán)節(jié)。課程設(shè)計的目的,一方面使學(xué)生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一方面,通過課程設(shè)計加強學(xué)生的實驗手段與實踐技能,培養(yǎng)學(xué)生獨立分析問題、解決問題、應(yīng)用知識的能力和創(chuàng)新精神。與本課程的實驗教學(xué)相比,課程設(shè)計獨立設(shè)課,具有更多的學(xué)時,給學(xué)生更多自行設(shè)計、自主實驗的機會,充分放手讓學(xué)生真正培養(yǎng)學(xué)生的實踐動手能力,全面提高學(xué)生的綜合素質(zhì)。 在設(shè)計的過

28、程中遇到問題,可以說得是困難重重,難免會遇到過各種各樣的問題,同時在設(shè)計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固,不過設(shè)計終于順利完成了,在設(shè)計中遇到了很多編程問題,最后在老師的辛勤指導(dǎo)下,終于游逆而解。同時,在老師的身上我學(xué)得到很多實用的知識,再次我表示感謝!同時,對給過我們幫助的所有同學(xué)和各位指導(dǎo)老師再次表示忠心的感謝! 請預(yù)覽后下載! 參考文獻 [1] 袁慶龍,候文義.Ni-P合金鍍層組織形貌及顯微硬度研究[J].太原理工大學(xué)學(xué)報,2001,32(1):51-53.(連續(xù)出版物:[序號] 主要責(zé)任者.文獻題名[J].刊名,出版年

29、份,卷號(期號):起止頁碼) [2]劉國鈞,王連成.圖書館史研究[M].北京:高等教育出版社,1979:15-18,31.(專著:[序號] 主要責(zé)任者.文獻題名[M].出版地:出版者,出版年:起止頁碼.) [3] 孫品一.高校學(xué)報編輯工作現(xiàn)代化特征[C].中國高等學(xué)校自然科學(xué)學(xué)報研究會.科技編輯學(xué)論文集(2).北京:北京師范大學(xué)出版社,1998:10-22.(論文集:[序號] 主要責(zé)任者.文獻題名[C]∥主編.論文集名.出版地:出版者,出版年:起止頁碼.) 請預(yù)覽后下載! 附:源代碼 /*makefile*/ filsys:main.o igetput.o iallfr

30、e.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 cc -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

31、 cc -c main.c igetput.o:igetput.c filesys.h cc -c igetput.c iallfre.o:iallfre.c filesys.h cc -iallfre.c ballfre.o:ballfre.c filesys.h cc -c ballfre.c name.o:name.c filesys.h cc -c name.c access.o:access.c filesys.h cc -c access.c log.o:log.c filesys.h cc -c log.c close.o:c

32、lose.c filesys.h cc -c close.c create.o:create.c filesys.h cc -c create.c delete.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.c open.o:open.c filesys.h cc -c open.c rdwt.o:rdwt.c filesys.h cc -c rdwt.c forma

33、t.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 請預(yù)覽后下載! /*filesys.h*/ #define BLOCKSIZ 512 #define SYSOPENFILE 40 #define DIRNUM 128 #define DIRSIZ 14 #define PWDSIZ 12 #define PWDNUM 32 #define NOFILE 20 #d

34、efine 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 DIFI

35、LE 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 EXICUT

36、E 4 #define DEFAULTMODE 00777 /*i_flag*/ 請預(yù)覽后下載! #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 0 sruct inode{ struct i

37、node *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_addr[NADDR]; } ; struct dinode{ unsigned short di_number

38、; unsigned short di_mode; unsigned short di_uid; unsigned short di_gid; unsigned long di_size; unsigned int di_addr[NADDR]; }; struct direct{ unsigned d_name[DIRSIZ]; unsigned int d_ino; }; 請預(yù)覽后下載! struct filsys{ unsigned short s_isize; unsigned long s_fsize; unsigned int s_nf

39、ree; unsigned short s_pfree; unsigned int s_free[NICFREE]; unsigned int s_ninode; unsigned short s_pinode; unsigned int s_inode[NICINOD]; unsigned int s_finode; char s_fmod; }; struct pwd{ unsigned short p_uid; unsigned short p_gid; unsigned password[PWOSIZ]; }; struct dir{ st

40、ruct direct direct[DIRNUM]; int size; }; struct hinode{ struct inode* i_forw; }; struct file{ char f_flag; unsigned int f_count; struct inode *f_inode; unsigned long f_off; }; struct user{ unsigned short u_default_mode; unsigned short u_uid; unsigned short u_gid; unsigned short

41、 u_ofile[NOFILE]; }; 請預(yù)覽后下載! extern struct hinode hinode[NHINO]; extern struct dir dir; extern struct file sys_ofile[SYSOPENFILE]; extern struct filsys filsys; extern struct pwd pwd[PWDNUM]; extern struct user user[USERNUM]; extern FILE *fd; extern struct inode *cur_path_inode; extern

42、 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(); exte

43、rn 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 #include"file

44、sys.h" struct hinode hinode[NHINO]; struct dir dir; struct file sys_ofile[SYSOPENFILE]; struct filsys filsys; 請預(yù)覽后下載! struct pwd pwd[PWDNUM]; struct user user[PWDNUM]; FILE *fd; struct inode* cur_path_inode; int user_id,file_block; main() { unsigned short ab_fd1,ab_fd2,ab_fd3,a

45、b_fd4; unsigned short bhy_fd1; char *buf; printf("\nDo you want to format the disk\n"); if(getchat()==y) { printf("Format will erase all context on the disk.Are you sure?\n"); getchar(); } else return; if(getchar()==y) formar(); else retrun; install(); _dir(); login(2118,"abcd");

46、 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

47、_block=BLOCKSIZ*4+20; buf=(char*)malloc(BLOCKSIZ*4+20); write(ab_fd2,buf,BLOCKSIZ*4+20); 請預(yù)覽后下載! 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(

48、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_bloc

49、k=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 #include"filesys.h" format() { struct inode *inode; struct direct dir_buf[BLOCKSIZ/(DIRSIZ+2)];

50、 struct files; 請預(yù)覽后下載! unsigned int block_buf[BLOCKSIZ/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

51、(fd,0,SEEK_SET); fwrite(buf,1,(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char),fd); pwd[0].p_uid=2116; pwd[0].p_gid=03; strcpy(pwd[0].password,"dddd"); pwd[1].p_uid=2117; pwd[1].p_gid=03; strcpy(pwd[1].password,"bbbb"); pwd[2].p_uid=2118; pwd[2].p_gid=04; strcpy(pwd[2].password,"

52、abcd"); pwd[3].p_uid=2119; pwd[3].p_gid=04; strcpy(pwd[3].password,"cccc"); pwd[4].p_uid=2220; pwd[4].p_gid=05; strcpy(pwd[4].password,"eeee"); inode=iget(1); inode->di_number=1; inode->di_mode=DEFAULTMODE|DIDIR; inode->di_size=3*(DIRSIZ+2); inode->di_addr[0]=0; strcpy(

53、dir_buf[0].d_name,".."); dir_buf[0].d_ino=1; strcpy(dir_buf[1].d_name,"."); dir_buf[1].d_ino=1; strcpy(dir_buf[2].d_name,"ect"); 請預(yù)覽后下載! dir_buf[2].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; ino

54、de->di_mode=DEFAULTMODE|DIDIR; inode->di_size=3*(DIRSIZ+2); inode->di_addr[0]=1; strcpy(dir_buf[0].d_name,".."); dir_buf[0].d_ino=1; strcpy(dir_buf[1].d_name,"."); dir_buf[1].d_ino=2; strcpy(dir_buf[2].d_name,"password"); dir_buf[2].d_ino=3; fseek(fd,DATASTART+BLOCKSIZ*1,SEEK_SET);

55、 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_addr[0]=2; for(i=5;i,PWDNUM;i++) { pwd[i].p_uid=0; pwd[i].p_gid=0; strcpy(pwd[i].password," ") } fseek(fd,DATAS

56、TART+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;i

57、de=NICNOD+4; block_buf[NICFREE-1]=FILEBLK+1; for(i=0;ii2;i--) { filsys.s_fre

58、e[NICFREE-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 #include"filsys.h"

59、 install() { 請預(yù)覽后下載! int i,j; fseek(fd,BLOCKSIZ,SEEK_SET); fread(&filsysk,1,sizeof(struct filsys),fd); for(i=0;i

60、) { user[i].u_uid=0; user[i].u_gid=0; for(j=0;jdi_size/(DIRSIZ+2); for(i=0;i

61、ze/(BLOCKSIZ/(DIRSIZ+2));i++) { fseek(fd,DATASTART+BLOCKSIZ*cur_path_inode->di_addr[i],SEEK_SET); fread(&dir.direct[BLOCKSIZ/(DIRSIZ+2))*i]1,BLOCKSIZ,fd); } fseek(fd,DATASTART+BLOCKSIZ*cur_path_inode->di_addr[i],SEEK_SET); fread(&dir.direct[(BLOCKSIZ)/(DIRSIZ+2)*i],1,cur_path_inode->

62、di_size%BLOCKSIZ,fd); } #include 請預(yù)覽后下載! #include"filesys.h" halt() { struct inode *inode; int i,j; chdir(".."); iput(cur_path_inode); for(i=0;iUSERNUM;i++) { if(user[i].u_uid!=0) { for(j=0;j

63、+1) { close(i,j); user[i].u_ofile[j]=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 switch\n"); exit(0); } #include

64、> #inclodu"filesys.h" struct inode *iget(dinodeid) unsigned int dinodeid; 請預(yù)覽后下載! { int existed=0,inodeid; long addr; struct inode *temp,*newinode; inodeid=dinodeid%NHINO; if(hinode[inodeid]).i_forw==NULL) existed=0; else { temp=hinode[inodeid].i_forw; while(temp)

65、{ if(temp->i_ino==inodeid)/*existed*/ { existed=1; temp->i_count++; return temp; } else temp=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); newino

66、de->i_forw=hinode[inodeid].i_forw; newinode->i_back=newinodel if(newinode->i_forw!=NULL) newinode->i_forw->i_back=newinode; hinode[inodeid].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; 請預(yù)覽后下載! return newinode; } input(pinode) /*input()*/ struct inode *pinode; { long addr; unsigned int block_num; int i; if(pinode->i_count>1) {

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!