操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計(jì)報(bào)告--后附源代碼
《操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計(jì)報(bào)告--后附源代碼》由會(huì)員分享,可在線閱讀,更多相關(guān)《操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計(jì)報(bào)告--后附源代碼(44頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 計(jì)算機(jī)操作系統(tǒng) 課程設(shè)計(jì)報(bào)告 設(shè)計(jì)項(xiàng)目名稱: 文件系統(tǒng)設(shè)計(jì) 專 業(yè): 網(wǎng)絡(luò)工程 班 級(jí): 201001 學(xué) 號(hào): 201026340117;201026340121 姓 名: 張世波 趙流男 指 導(dǎo) 教 師: 張 瑞 紅 請(qǐng)預(yù)覽后下載! 目錄
2、 1 課程設(shè)計(jì)簡(jiǎn)介 1 1.1 課程設(shè)計(jì)的目的 1 1.2 課程設(shè)計(jì)內(nèi)容 1 2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì) 2 2.1 預(yù)定義 2 2.2 結(jié)構(gòu)體 2 2.3 全局變量和函數(shù) 2 3 功能模塊(或算法)描述 3 3.1 模塊劃分 4 3.2 模塊流程圖 6 4 程序運(yùn)行結(jié)果 4 5心得體會(huì) 5 參考文獻(xiàn) 6 附源代碼 7 請(qǐng)預(yù)覽后下載! 1 課程設(shè)計(jì)簡(jiǎn)介 1.1 課程設(shè)計(jì)的目的 課程設(shè)計(jì)目的使學(xué)生熟悉文件管理系統(tǒng)的設(shè)計(jì)方法;加深對(duì)所學(xué)各種文件操作的了解及其操作方法的特點(diǎn)。通過模擬文件系統(tǒng)的實(shí)現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識(shí), 加深對(duì)教
3、材中的重要算法的理解。同時(shí)通過編程實(shí)現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,提高綜合運(yùn)用各專業(yè)課知識(shí)的能力。 1.2 課程設(shè)計(jì)內(nèi)容 課程設(shè)計(jì)內(nèi)容設(shè)計(jì)一個(gè)簡(jiǎn)單的多用戶文件系統(tǒng)。即 ①在系統(tǒng)中用一個(gè)文件來模擬一個(gè)磁盤; ②此系統(tǒng)至少有:Create、delete、open、close、read、write等和部分文件屬性的功能。 ③實(shí)現(xiàn)這個(gè)文件系統(tǒng)。 ④能實(shí)際演示這個(gè)文件系統(tǒng)?;旧鲜沁M(jìn)入一個(gè)界面(此界面就是該文件系統(tǒng)的界面)后,可以實(shí)現(xiàn)設(shè)計(jì)的操作要求。 1)設(shè)計(jì)一個(gè)10個(gè)用戶的文件系統(tǒng),每次用戶可保存10個(gè)文件,一次運(yùn)行用戶可以打開5個(gè)文件。 2)程序采用二級(jí)文件目錄
4、(即設(shè)置主目錄MFD)和用戶文件目錄(UFD)。另外,為打開文件設(shè)置了運(yùn)行文件目錄(AFD)。 3)為了便于實(shí)現(xiàn),對(duì)文件的讀寫作了簡(jiǎn)化,在執(zhí)行讀寫命令時(shí),只需改讀寫指針,并不進(jìn)行實(shí)際的讀寫操作。 4)因系統(tǒng)小,文件目錄的檢索使用了簡(jiǎn)單的線性搜索。 5)文件保護(hù)簡(jiǎn)單使用了三位保護(hù)碼:允許讀寫執(zhí)行、對(duì)應(yīng)位為1,對(duì)應(yīng)位為0,則表示不允許讀寫、執(zhí)行。 6)程序中使用的主要設(shè)計(jì)結(jié)構(gòu)如下:主文件目錄和用戶文件目錄(MFD、UFD),打開文件目錄(AFD)即運(yùn)行文件目錄,如圖5.1所示。 請(qǐng)預(yù)覽后下載! 2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì) 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é)點(diǎn)中 指向數(shù)據(jù)塊的指針個(gè)數(shù) #define GROUPNUM DATABLKNUM/BLKGRUPNUM+1 //數(shù)據(jù)塊組 組數(shù) #define DINODESIZ 512 //磁盤i結(jié)點(diǎn)區(qū)的大?。臻g32512) #define DINODENUM 32 //磁盤i結(jié)點(diǎn)區(qū)的塊數(shù) #define SYSOPENFILE 40
6、 #define DIRNUM 32 //一個(gè)目錄下的最多目錄和文件的總和數(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 //一個(gè)用戶最多可以
7、打開的文件數(shù)目 #define DINODESTART 4*BLOCKSIZ //i結(jié)點(diǎn)區(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é)點(diǎn)結(jié)構(gòu), struct inode{ // char di_name[DIRSIZ]; 請(qǐng)預(yù)覽后下載! unsigned __int16 di_ino; /*磁盤i節(jié)點(diǎn)標(biāo)識(shí)*/ unsigned __int16 di_number; /*關(guān)聯(lián)文件數(shù),當(dāng)為0時(shí)表示刪除文件*/
9、 unsigned __int16 di_mode; /*存取權(quán)限*/ unsigned __int16 di_uid; /*磁盤i節(jié)點(diǎn)用戶id*/ unsigned __int16 di_gid; /*磁盤i節(jié)點(diǎn)權(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 指針 */ }; // 目錄項(xiàng)結(jié)構(gòu) struct direct{ char d_name[DIRSIZ]; /*目錄名(14字節(jié))*/ __int16 d_ino; /*目錄號(hào)*/ }; //超級(jí)快結(jié)構(gòu) struct super_block{ unsigned __int16 s_inodes_count; /* inodes 計(jì)數(shù) */ unsigned __int16 s_blocks_count; /*
11、 blocks 計(jì)數(shù) */ unsigned __int16 s_r_blocks_count; /* 保留的 blocks 計(jì)數(shù) */ unsigned __int16 s_free_blocks_count; // 空閑的 blocks 計(jì)數(shù) unsigned __int16 s_free_inodes_count; /* 空閑的 inodes 計(jì)數(shù) */ unsigned __int16 s_free_blocks_group[GROUPNUM];//新增 一個(gè)數(shù)組來記錄每個(gè)數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計(jì)數(shù) unsigned __int16 s_firs
12、t_data_block; /* 第一個(gè)數(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; }; 請(qǐng)預(yù)覽后下載! 2.3 全局變量和函數(shù) // 全局變量 unsigned __int8 di_bitmap[DINODENUM]; // 硬盤inode節(jié)點(diǎn)位圖1表示已使用 0表示未使用 unsigned __int8 bk_bitmap[DAT
14、ABLKNUM]; // 數(shù)據(jù)塊block位圖 struct super_block filsys; //超級(jí)塊 struct pwd pwd[PWDNUM]; FILE *fd; //文件指針 struct inode *cur_inode; //i節(jié)點(diǎn)當(dāng)前目錄指針 struct inode *inodetemp; //i節(jié)點(diǎn)指針 const char fsystemname[20]="Linux.EXT2"; //模擬硬盤的文件名 struct direct dir_buf[BLOCKSIZ / sizeof(struct direc
15、t)]; //目錄數(shù)組 char cmdhead[20];//cmd 的頭 表示所在哪個(gè)文件夾 、 int i_lock=0;//inode位圖鎖 可能會(huì)多線程 int b_lock=0;//block位圖鎖 struct pwd *cur_user; /* 全局函數(shù) */ extern int Format();//格式化磁盤 extern int Install();//啟動(dòng),安裝文件系統(tǒng) struct inode * read_inode(int);//install里面讀取文件dinode struct direct * read_dir_data(int);/
16、/讀取存儲(chǔ)文件夾的物理塊 extern void showdir();//命令 dir int Enterdir(char[]);//進(jìn)入某個(gè)文件夾 命令-- cd 文件名 int Fd_dirfile(char[]);//查找當(dāng)前目錄里的文件 沒找到返回-1 找到返回inode號(hào) int Iscmd(char[]);//判斷是否兩個(gè)字符串的命令 void two_cmd(char[],char[]);//兩個(gè)字符串的命令 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é)點(diǎn)的分配與釋放(當(dāng)一個(gè)新文件被建立的時(shí)候,在給該文件分配磁盤存儲(chǔ)區(qū)之前, 應(yīng)為該文件分配存放該文件說明信息的磁盤i節(jié)點(diǎn),當(dāng)從文件系統(tǒng)中刪除某個(gè)文件時(shí)
18、, 應(yīng)首先刪除它的磁盤i節(jié)點(diǎn)項(xiàng)。)*/ int ialloc();/*開辟一個(gè)空閑的i節(jié)點(diǎn),返回i節(jié)點(diǎn)*///磁盤塊分配與釋放函數(shù) int balloc(int);//申請(qǐng)硬盤空間 請(qǐng)預(yù)覽后下載! 結(jié)構(gòu)體說明: 硬盤模擬文件:每個(gè)數(shù)據(jù)塊512字節(jié),第一個(gè)數(shù)據(jù)塊空閑備用,第2塊是超級(jí)塊,第3塊是inode位圖,第4塊是block位圖,第5塊開始有32塊是inode節(jié)點(diǎn),然后是數(shù)據(jù)區(qū)block,512塊。 超級(jí)塊:存放整個(gè)文件系統(tǒng)的基本狀態(tài),如:inode塊數(shù),block總塊數(shù),空閑的block計(jì)數(shù),空閑的inode計(jì)數(shù),每個(gè)數(shù)據(jù)塊組中的空閑塊數(shù)(為block分組,便于
19、讀?。?,每個(gè)block的大小(512字節(jié)),每個(gè)數(shù)據(jù)塊組的block塊數(shù)。 Inode位圖:用一個(gè)數(shù)組來描述每個(gè)inode的使用狀況,1表示被占用,0表示空閑。 Block位圖:用一個(gè)數(shù)組來描述每個(gè)數(shù)據(jù)區(qū)的block的使用狀況,1表示被占用,0表示空閑。 inode節(jié)點(diǎn):inode記錄了文件或者目錄在數(shù)據(jù)區(qū)存放位置,是文件還是目錄,是否系統(tǒng)文件,屬于管理員組還是普通用戶組,是由誰創(chuàng)建的,創(chuàng)建時(shí)間等。如果是目錄,則還記錄了里面包含多少個(gè)文件或子目錄。是文件則記錄了文件的大小。讀取文件要先通過inode然后找到block,才能讀取。 Block數(shù)據(jù)塊:存放文件的地方,如果是目錄則記錄了這個(gè)
20、目錄下所有的文件和子目錄的名稱和所占的inode 如果是文本文檔,則是字節(jié)流文件。 3 功能模塊(或算法)描述 我負(fù)責(zé)整體設(shè)計(jì),實(shí)現(xiàn)底層具體設(shè)計(jì),format格式化,install安裝,login登錄,ialloc申請(qǐng)inode空間,balloc申請(qǐng)block空間。 3.1 format 格式化 只寫打開模擬文件,初始化超級(jí)快,初始化dinode位圖 block位圖,初始化主目錄,初始化etc目錄,初始化管理員admin 目錄,初始化用戶xiao 目錄,初始化 用戶passwd文件,寫入模擬硬盤文件。 3.2 install 安裝 讀寫打開模擬文件,讀取dinode位圖 b
21、lock位圖,讀取主目錄,讀取etc目錄,讀取管理員admin 目錄,讀取用戶xiao 目錄,讀取 用戶passwd文件。 3.3 login 登陸 用戶輸入用戶名和密碼,在passwd文件中查找是否有此用戶,核對(duì)密碼。正確則登陸成功,當(dāng)前目錄設(shè)定到當(dāng)前用戶文件夾下。登錄流程圖 3.4 ialloc 申請(qǐng)inode空間 先檢測(cè)inode位圖是否加鎖,是則退出。加鎖,檢測(cè)inode空間是否還有已滿,是則退出。在inode位圖中順序查找空閑的inode,找到則返回inode地址,block解鎖。函數(shù)結(jié)束。流程圖3.3 請(qǐng)預(yù)覽后下載! 登錄流程圖 ialloc 流程圖
22、3.3 balloc流程圖3.4 3.5 balloc 申請(qǐng)block空間 先檢測(cè)block位圖是否加鎖,是則退出。加鎖,檢測(cè)block空間是否還有k個(gè)空閑,否則退出。在還有空閑block的組中查找是否有k個(gè)空閑,沒有則去下一個(gè)block組中查找,找到則返回block地址,block解鎖。函數(shù)結(jié)束。流程圖3.4 3.5 create 創(chuàng)建文本文件 查找當(dāng)前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi)容,以‘###’結(jié)束。申請(qǐng)inode空間(ialloc函數(shù)),申請(qǐng)硬盤block空間(balloc函數(shù)),申請(qǐng)失敗則結(jié)束。將文件內(nèi)容寫入inode空間和block空間
23、。修改當(dāng)前目錄的結(jié)構(gòu),修改超級(jí)快,修改inode位圖,block位圖,寫入模擬硬盤。流程圖3.5 3.7 cdir 創(chuàng)建文件夾 查找當(dāng)前目錄下是否有同名文件,是則退出,否則,申請(qǐng)inode空間(ialloc函數(shù)),申請(qǐng)硬盤block空間(balloc函數(shù)),申請(qǐng)失敗則結(jié)束。將文件夾內(nèi)容寫入inode空間和block空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級(jí)快,修改inode位圖,block位圖,寫入模擬硬盤。 3.7 read edit –讀取和追加文本文件 Read----查找當(dāng)前目錄下是否該文件,沒有則退出,否則調(diào)用access()權(quán)限判斷,有權(quán)限則判斷是不是文件,不是則退出,是文件則讀取
24、文件并顯示。 Edit----調(diào)用讀取文件模塊,讀取成功則用戶輸入追加的內(nèi)容,如果追加的內(nèi)容大于一個(gè)block則申請(qǐng)block空間,失敗則退出,申請(qǐng)成功則保存文件。 3.8 access(文件名) 權(quán)限判斷 先判斷當(dāng)前目錄是否有該文件,在當(dāng)前目錄的block找到該文件,判斷當(dāng)前登錄用戶是哪個(gè)組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級(jí)別。 請(qǐng)預(yù)覽后下載! 如果是該用戶創(chuàng)建的 則有讀寫權(quán)限如果當(dāng)前用戶是管理員組的 也具有讀寫權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。 3.9 cd –進(jìn)入子目錄 或上級(jí)目錄 查找當(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,修改超級(jí)塊,寫入模擬硬盤。流程圖3.9 3.8 access(文件名) 權(quán)限判斷 先判斷當(dāng)前目錄是否有該文件,在當(dāng)前目錄的block找到該文件,判斷當(dāng)前登錄用戶是哪個(gè)組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級(jí)別。 如果是該用戶創(chuàng)建的 則有讀寫權(quán)限如果當(dāng)前用戶是管理員組的 也具有讀寫權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。 請(qǐng)預(yù)覽后下載! 4 程序運(yùn)行結(jié)果 1格式化 和登錄界面 登錄后顯示幫助信息 ,進(jìn)入到用戶文件夾下 2 di
27、r命令---顯示當(dāng)前目錄下的文件和目錄 3 logout命令---注銷用戶 請(qǐng)預(yù)覽后下載! 普通用戶無法進(jìn)入admin管理員目錄。 請(qǐng)預(yù)覽后下載! 5心得體會(huì) 操作系統(tǒng)課程設(shè)計(jì)是本課程重要的實(shí)踐教學(xué)環(huán)節(jié)。課程設(shè)計(jì)的目的,一方面使學(xué)生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一方面,通過課程設(shè)計(jì)加強(qiáng)學(xué)生的實(shí)驗(yàn)手段與實(shí)踐技能,培養(yǎng)學(xué)生獨(dú)立分析問題、解決問題、應(yīng)用知識(shí)的能力和創(chuàng)新精神。與本課程的實(shí)驗(yàn)教學(xué)相比,課程設(shè)計(jì)獨(dú)立設(shè)課,具有更多的學(xué)時(shí),給學(xué)生更多自行設(shè)計(jì)、自主實(shí)驗(yàn)的機(jī)會(huì),充分放手讓學(xué)生真正培養(yǎng)學(xué)生的實(shí)踐動(dòng)手能力,全面提高學(xué)生的綜合素質(zhì)。 在設(shè)計(jì)的過
28、程中遇到問題,可以說得是困難重重,難免會(huì)遇到過各種各樣的問題,同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過的知識(shí)理解得不夠深刻,掌握得不夠牢固,不過設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多編程問題,最后在老師的辛勤指導(dǎo)下,終于游逆而解。同時(shí),在老師的身上我學(xué)得到很多實(shí)用的知識(shí),再次我表示感謝!同時(shí),對(duì)給過我們幫助的所有同學(xué)和各位指導(dǎo)老師再次表示忠心的感謝! 請(qǐng)預(yù)覽后下載! 參考文獻(xiàn) [1] 袁慶龍,候文義.Ni-P合金鍍層組織形貌及顯微硬度研究[J].太原理工大學(xué)學(xué)報(bào),2001,32(1):51-53.(連續(xù)出版物:[序號(hào)] 主要責(zé)任者.文獻(xiàn)題名[J].刊名,出版年
29、份,卷號(hào)(期號(hào)):起止頁碼) [2]劉國鈞,王連成.圖書館史研究[M].北京:高等教育出版社,1979:15-18,31.(專著:[序號(hào)] 主要責(zé)任者.文獻(xiàn)題名[M].出版地:出版者,出版年:起止頁碼.) [3] 孫品一.高校學(xué)報(bào)編輯工作現(xiàn)代化特征[C].中國高等學(xué)校自然科學(xué)學(xué)報(bào)研究會(huì).科技編輯學(xué)論文集(2).北京:北京師范大學(xué)出版社,1998:10-22.(論文集:[序號(hào)] 主要責(zé)任者.文獻(xiàn)題名[C]∥主編.論文集名.出版地:出版者,出版年:起止頁碼.) 請(qǐng)預(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 請(qǐng)預(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*/ 請(qǐng)預(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; }; 請(qǐng)預(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]; }; 請(qǐng)預(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
44、sys.h" struct hinode hinode[NHINO]; struct dir dir; struct file sys_ofile[SYSOPENFILE]; struct filsys filsys; 請(qǐng)預(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); 請(qǐng)預(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
50、 struct files; 請(qǐng)預(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"); 請(qǐng)預(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;ii 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 59、
install()
{
請(qǐng)預(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;j 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 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;
請(qǐng)預(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;
請(qǐng)預(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《筍芽?jī)骸氛n件
- 高速鐵路同相供電
- 二年級(jí)語文下冊(cè)-第4單元-13《激光的話》課件4-語文S版
- 《一枚金幣》課件
- 1441單項(xiàng)式乘以多項(xiàng)式(課件)PPT
- 12分式的乘法和除法
- 常見蔬菜分類
- 保險(xiǎn)客戶經(jīng)營1361法則
- 現(xiàn)場(chǎng)目視管理與看板管理
- 高中政治-4.2文化在繼承中發(fā)展課件1-新人教版必修3PPT文檔
- 八年級(jí)生物上冊(cè) 181 微生物在生物圈中的作用(第2課時(shí))課件(2)(新版)北師大版
- 人生的夢(mèng)想
- 動(dòng)物生理學(xué)-第六章課件
- IE經(jīng)典管理基礎(chǔ)
- AfternoonandEvening課件