操作系統(tǒng)-文件系統(tǒng)-課程設(shè)計報告--后附源代碼
《操作系統(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 學 號: 201026340117;201026340121 姓 名: 張世波 趙流男 指 導 教 師: 張 瑞 紅 請預覽后下載! 目錄
2、 1 課程設(shè)計簡介 1 1.1 課程設(shè)計的目的 1 1.2 課程設(shè)計內(nèi)容 1 2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計 2 2.1 預定義 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 請預覽后下載! 1 課程設(shè)計簡介 1.1 課程設(shè)計的目的 課程設(shè)計目的使學生熟悉文件管理系統(tǒng)的設(shè)計方法;加深對所學各種文件操作的了解及其操作方法的特點。通過模擬文件系統(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í)行、對應位為1,對應位為0,則表示不允許讀寫、執(zhí)行。 6)程序中使用的主要設(shè)計結(jié)構(gòu)如下:主文件目錄和用戶文件目錄(MFD、UFD),打開文件目錄(AFD)即運行文件目錄,如圖5.1所示。 請預覽后下載! 2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計 2.1 預定義 #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ū)的大小(空間32512) #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引導 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]; 請預覽后下載! unsigned __int16 di_ino; /*磁盤i節(jié)點標識*/ unsigned __int16 di_number; /*關(guān)聯(lián)文件數(shù),當為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; }; 請預覽后下載! 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é)點當前目錄指針 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[]);//查找當前目錄里的文件 沒找到返回-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é)點的分配與釋放(當一個新文件被建立的時候,在給該文件分配磁盤存儲區(qū)之前, 應為該文件分配存放該文件說明信息的磁盤i節(jié)點,當從文件系統(tǒng)中刪除某個文件時
18、, 應首先刪除它的磁盤i節(jié)點項。)*/ int ialloc();/*開辟一個空閑的i節(jié)點,返回i節(jié)點*///磁盤塊分配與釋放函數(shù) int balloc(int);//申請硬盤空間 請預覽后下載! 結(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 功能模塊(或算法)描述 我負責整體設(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文件中查找是否有此用戶,核對密碼。正確則登陸成功,當前目錄設(shè)定到當前用戶文件夾下。登錄流程圖 3.4 ialloc 申請inode空間 先檢測inode位圖是否加鎖,是則退出。加鎖,檢測inode空間是否還有已滿,是則退出。在inode位圖中順序查找空閑的inode,找到則返回inode地址,block解鎖。函數(shù)結(jié)束。流程圖3.3 請預覽后下載! 登錄流程圖 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)建文本文件 查找當前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi)容,以‘###’結(jié)束。申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結(jié)束。將文件內(nèi)容寫入inode空間和block空間
23、。修改當前目錄的結(jié)構(gòu),修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。流程圖3.5 3.7 cdir 創(chuàng)建文件夾 查找當前目錄下是否有同名文件,是則退出,否則,申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結(jié)束。將文件夾內(nèi)容寫入inode空間和block空間。修改當前目錄的結(jié)構(gòu),修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。 3.7 read edit –讀取和追加文本文件 Read----查找當前目錄下是否該文件,沒有則退出,否則調(diào)用access()權(quán)限判斷,有權(quán)限則判斷是不是文件,不是則退出,是文件則讀取
24、文件并顯示。 Edit----調(diào)用讀取文件模塊,讀取成功則用戶輸入追加的內(nèi)容,如果追加的內(nèi)容大于一個block則申請block空間,失敗則退出,申請成功則保存文件。 3.8 access(文件名) 權(quán)限判斷 先判斷當前目錄是否有該文件,在當前目錄的block找到該文件,判斷當前登錄用戶是哪個組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級別。 請預覽后下載! 如果是該用戶創(chuàng)建的 則有讀寫權(quán)限如果當前用戶是管理員組的 也具有讀寫權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。 3.9 cd –進入子目錄 或上級目錄 查找當前目錄是否有該子目錄,沒有則退出,調(diào)用access()判斷當前用戶
25、是否有權(quán)限,無則退出,有則讀取該子目錄的inode,將當前目錄指向該目錄。 3.10 attr(文件名)查看文件或者文件夾的屬性 先查找當前目錄下是否有該文件或目錄,有則判斷文件是否系統(tǒng)文件,是否文本文件,是否目錄,由誰創(chuàng)建,屬于什么組,占用的block,和inode。將其全部顯示出來。 3.9 del 刪除文件或目錄 查找當前目錄是否有該文件名,沒有則退出,有則調(diào)用access()判斷是否有權(quán)限,有則判斷是否為系統(tǒng)文件,是則無法刪除,不是則判斷是否是文件,是文件則直接刪除,不是則判斷是否文件夾,是文件夾則判斷該文件夾下是否有文件,有文件則無法刪除。提示用戶是否刪除,確認則刪除文件,修
26、改當前文件夾inode,block結(jié)構(gòu),修改該文件占有的inode和block位圖為0,修改超級塊,寫入模擬硬盤。流程圖3.9 3.8 access(文件名) 權(quán)限判斷 先判斷當前目錄是否有該文件,在當前目錄的block找到該文件,判斷當前登錄用戶是哪個組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級別。 如果是該用戶創(chuàng)建的 則有讀寫權(quán)限如果當前用戶是管理員組的 也具有讀寫權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。 請預覽后下載! 4 程序運行結(jié)果 1格式化 和登錄界面 登錄后顯示幫助信息 ,進入到用戶文件夾下 2 di
27、r命令---顯示當前目錄下的文件和目錄 3 logout命令---注銷用戶 請預覽后下載! 普通用戶無法進入admin管理員目錄。 請預覽后下載! 5心得體會 操作系統(tǒng)課程設(shè)計是本課程重要的實踐教學環(huán)節(jié)。課程設(shè)計的目的,一方面使學生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一方面,通過課程設(shè)計加強學生的實驗手段與實踐技能,培養(yǎng)學生獨立分析問題、解決問題、應用知識的能力和創(chuàng)新精神。與本課程的實驗教學相比,課程設(shè)計獨立設(shè)課,具有更多的學時,給學生更多自行設(shè)計、自主實驗的機會,充分放手讓學生真正培養(yǎng)學生的實踐動手能力,全面提高學生的綜合素質(zhì)。 在設(shè)計的過
28、程中遇到問題,可以說得是困難重重,難免會遇到過各種各樣的問題,同時在設(shè)計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,不過設(shè)計終于順利完成了,在設(shè)計中遇到了很多編程問題,最后在老師的辛勤指導下,終于游逆而解。同時,在老師的身上我學得到很多實用的知識,再次我表示感謝!同時,對給過我們幫助的所有同學和各位指導老師再次表示忠心的感謝! 請預覽后下載! 參考文獻 [1] 袁慶龍,候文義.Ni-P合金鍍層組織形貌及顯微硬度研究[J].太原理工大學學報,2001,32(1):51-53.(連續(xù)出版物:[序號] 主要責任者.文獻題名[J].刊名,出版年
29、份,卷號(期號):起止頁碼) [2]劉國鈞,王連成.圖書館史研究[M].北京:高等教育出版社,1979:15-18,31.(專著:[序號] 主要責任者.文獻題名[M].出版地:出版者,出版年:起止頁碼.) [3] 孫品一.高校學報編輯工作現(xiàn)代化特征[C].中國高等學校自然科學學報研究會.科技編輯學論文集(2).北京:北京師范大學出版社,1998:10-22.(論文集:[序號] 主要責任者.文獻題名[C]∥主編.論文集名.出版地:出版者,出版年:起止頁碼.) 請預覽后下載! 附:源代碼 /*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 請預覽后下載! /*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*/ 請預覽后下載! #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; }; 請預覽后下載! 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]; }; 請預覽后下載! 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; 請預覽后下載! 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); 請預覽后下載! 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; 請預覽后下載! 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"); 請預覽后下載! 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()
{
請預覽后下載!
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;
請預覽后下載!
{
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;
請預覽后下載!
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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工重大危險源安全管理制度
- 安全培訓資料:典型建筑火災的防治基本原則與救援技術(shù)
- 企業(yè)雙重預防體系應知應會知識問答
- 8 各種煤礦安全考試試題
- 9 危險化學品經(jīng)營單位安全生產(chǎn)管理人員模擬考試題庫試卷附答案
- 加壓過濾機司機技術(shù)操作規(guī)程
- 樹脂砂混砂工藝知識總結(jié)
- XXXXX現(xiàn)場安全應急處置預案
- 某公司消防安全檢查制度總結(jié)
- 1 煤礦安全檢查工(中級)職業(yè)技能理論知識考核試題含答案
- 4.燃氣安全生產(chǎn)企業(yè)主要負責人模擬考試題庫試卷含答案
- 工段(班組)級安全檢查表
- D 氯化工藝作業(yè)模擬考試題庫試卷含答案-4
- 建筑起重司索信號工安全操作要點
- 實驗室計量常見的30個問問答題含解析