2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)</p><p>  題 目 虛擬文件系統(tǒng)的實(shí)現(xiàn)</p><p>  計(jì)算機(jī)科學(xué)學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù) 專業(yè)</p><p>  10 級 計(jì)算科學(xué)與技術(shù)本科 班</p><p><b>  目錄</b></p><p>  第一章 課程設(shè)計(jì)簡介

2、1</p><p>  1.1 課程設(shè)計(jì)的目的1</p><p>  1.2 課程設(shè)計(jì)內(nèi)容1</p><p>  第二章 數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)2</p><p><b>  2.1 預(yù)定義2</b></p><p><b>  2.2 結(jié)構(gòu)體2</b></p>

3、;<p>  2.3 全局變量和函數(shù)4</p><p>  2.4結(jié)構(gòu)體說明5</p><p>  第三章 功能模塊(或算法)描述5</p><p>  3.1 format 格式化5</p><p>  3.2 install 安裝6</p><p>  3.3 login 登陸6<

4、;/p><p>  3.4 ialloc 申請inode空間6</p><p>  3.5 balloc 申請block空間6</p><p>  3.6 create 創(chuàng)建文本文件7</p><p>  3.7 cdir 創(chuàng)建文件夾7</p><p>  3.8 edit –讀取和追加文本文件7</p&g

5、t;<p>  3.9 access(文件名) 權(quán)限判斷7</p><p>  3.10 cd –進(jìn)入子目錄 或上級目錄8</p><p>  3.11 attr(文件名)查看文件或者文件夾的屬性8</p><p>  3.12 del 刪除文件或目錄8</p><p>  第四章 程序運(yùn)行結(jié)果8</p>

6、<p>  4.1格式化 和登錄界面8</p><p>  4.2 ls命令---顯示當(dāng)前目錄下的文件和目錄9</p><p>  4.3 logout命令---注銷用戶9</p><p>  第五章 心得體會9</p><p><b>  參考文獻(xiàn)10</b></p><

7、;p><b>  附:源代碼11</b></p><p>  第一章 課程設(shè)計(jì)簡介</p><p>  1.1 課程設(shè)計(jì)的目的</p><p>  課程設(shè)計(jì)目的使學(xué)生熟悉文件管理系統(tǒng)的設(shè)計(jì)方法;加深對所學(xué)各種文件操作的了解及其操作方法的特點(diǎn)。通過模擬文件系統(tǒng)的實(shí)現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識, 加深對教材中的重要算法的理解。

8、同時(shí)通過編程實(shí)現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,提高綜合運(yùn)用各專業(yè)課知識的能力。</p><p>  1.2 課程設(shè)計(jì)內(nèi)容</p><p>  課程設(shè)計(jì)內(nèi)容設(shè)計(jì)一個(gè)簡單的多用戶文件系統(tǒng)。即:</p><p> ?、僭谙到y(tǒng)中用一個(gè)文件來模擬一個(gè)磁盤;</p><p> ?、诖讼到y(tǒng)至少有:login、create、del、ls、cd

9、、md、rd、write、rename、attr、relogin、close等和部分文件屬性的功能。</p><p>  ③實(shí)現(xiàn)這個(gè)文件系統(tǒng)。</p><p>  ④能實(shí)際演示這個(gè)文件系統(tǒng)?;旧鲜沁M(jìn)入一個(gè)界面(此界面就是該文件系統(tǒng)的界面)后,可以實(shí)現(xiàn)設(shè)計(jì)的操作要求。</p><p>  1)設(shè)計(jì)一個(gè)10個(gè)用戶的文件系統(tǒng),每次用戶可保存10個(gè)文件,一次運(yùn)行用戶可以打

10、開5個(gè)文件。</p><p>  2)程序采用二級文件目錄(即設(shè)置主目錄MFD)和用戶文件目錄(UFD)。另外,為打開文件設(shè)置了運(yùn)行文件目錄(AFD)。</p><p>  3)為了便于實(shí)現(xiàn),對文件的讀寫作了簡化,在執(zhí)行讀寫命令時(shí),只需改讀寫指針,并不進(jìn)行實(shí)際的讀寫操作。</p><p>  4)因系統(tǒng)樣,文件目錄的檢索使用了簡單的線性搜索。</p>

11、<p>  5)文件保護(hù)簡單使用了三位保護(hù)碼:允許讀寫執(zhí)行、對應(yīng)位為1,對應(yīng)位為0,則表示不允許讀寫、執(zhí)行。</p><p>  6)程序中使用的主要設(shè)計(jì)結(jié)構(gòu)如下:主文件目錄和用戶文件目錄(MFD、UFD),打開文件目錄(AFD)即運(yùn)行文件目錄,如圖5.1所示。 </p><p>  第二章 數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)</p><p><b>  2.1

12、預(yù)定義</b></p><p>  #define BLOCKSIZ 512//磁盤塊的大樣</p><p>  #define DATABLKNUM 512//數(shù)據(jù)塊的數(shù)目</p><p>  #define BLKGRUPNUM50//數(shù)據(jù)塊組包含多少數(shù)據(jù)塊</p><p>  #define P_N_B

13、LOCKS15//inode節(jié)點(diǎn)中 指向數(shù)據(jù)塊的指針個(gè)數(shù)</p><p>  #defineGROUPNUMDATABLKNUM/BLKGRUPNUM+1 //數(shù)據(jù)塊組 組數(shù)</p><p>  #define DINODESIZ 512//磁盤i結(jié)點(diǎn)區(qū)的大樣(空間32×512)</p><p>  #define DINODENUM

14、 32//磁盤i結(jié)點(diǎn)區(qū)的塊數(shù)</p><p>  #define SYSOPENFILE 40</p><p>  #define DIRNUM 32//一個(gè)目錄下的最多目錄和文件的總和數(shù)</p><p>  #define DIRSIZ 14//文件、目錄名的長度(字節(jié))</p><p>  #defi

15、ne UPWDSIZ 15//密碼的長度</p><p>  #define UNAMSIZ 15//用戶名的長度</p><p>  #define PWDSIZsizeof(struct pwd) //密碼結(jié)構(gòu)的長度 </p><p>  #define PWDNUM BLOCKSIZ/PWDSIZ//密碼數(shù)

16、據(jù)空間的大樣(pwd為單位)</p><p>  #define NOFILE 20//一個(gè)用戶最多可以打開的文件數(shù)目</p><p>  #define DINODESTART 4*BLOCKSIZ</p><p>  //i結(jié)點(diǎn)區(qū)的開始地址-inodes table ,1引導(dǎo) 2超塊 3block bitmap 4inode bitmap <

17、/p><p>  #define DATASTART (2+DINODENUM)*BLOCKSIZ//數(shù)據(jù)區(qū)的開始地址</p><p>  #defineDATASTARTNO36//數(shù)據(jù)區(qū)開始指針</p><p>  #define DIMODE_EMPTY00000/*可以用的空間*/</p><p>  #define D

18、IMODE_FILE00001</p><p>  #define DIMODE_DIR 00002</p><p>  #define DIMODE_PASSWD00004</p><p>  #define GRUP_00//管理員組</p><p>  #define GRUP_11</p>

19、<p>  #define GRUP_22</p><p>  #define GRUP_44</p><p><b>  2.2 結(jié)構(gòu)體</b></p><p>  //磁盤i結(jié)點(diǎn)結(jié)構(gòu),</p><p>  struct inode{</p><p>  // char

20、di_name[DIRSIZ];</p><p>  unsigned __int16 di_ino;/*磁盤i節(jié)點(diǎn)標(biāo)識*/</p><p>  unsigned __int16 di_number;/*關(guān)聯(lián)文件數(shù),當(dāng)為0時(shí)表示刪除文件*/</p><p>  unsigned __int16 di_mode;/*存取權(quán)限*/</p>

21、<p>  unsigned __int16 di_uid;/*磁盤i節(jié)點(diǎn)用戶id*/</p><p>  unsigned __int16 di_gid;/*磁盤i節(jié)點(diǎn)權(quán)限組id*/ //1管理員組 2用戶組</p><p>  unsigned __int32 di_size;/*文件大樣*/</p><p>  unsigned __

22、int32 di_ctime; /* Creation time */</p><p>  unsigned __int32 di_mtime; /* Modification time */</p><p>  unsigned __int16 di_block[P_N_BLOCKS]; /* 一組 block 指針 */</p><p><b

23、>  };</b></p><p><b>  //目錄項(xiàng)結(jié)構(gòu)</b></p><p>  struct direct{</p><p>  chard_name[DIRSIZ];/*目錄名(14字節(jié))*/</p><p>  __int16 d_ino;/*目錄號*/</p>&

24、lt;p><b>  };</b></p><p><b>  //超級快結(jié)構(gòu)</b></p><p>  struct super_block{</p><p>  unsigned __int16 s_inodes_count; /* inodes 計(jì)數(shù) */</p><p> 

25、 unsigned __int16 s_blocks_count; /* blocks 計(jì)數(shù) */</p><p>  unsigned __int16 s_r_blocks_count; /* 保留的 blocks 計(jì)數(shù) */</p><p>  unsigned __int16 s_free_blocks_count; // 空閑的 blocks 計(jì)數(shù) </p&g

26、t;<p>  unsigned __int16 s_free_inodes_count; /* 空閑的 inodes 計(jì)數(shù) */</p><p>  unsigned __int16 s_free_blocks_group[GROUPNUM];//新增 一個(gè)數(shù)組來記錄每個(gè)數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計(jì)數(shù) </p><p>  unsigned __int16 s_first_da

27、ta_block; /* 第一個(gè)數(shù)據(jù) block */</p><p>  unsigned __int16 s_log_block_size; /* block 的大樣 */</p><p>  unsigned __int16 s_blocks_per_group; /* 每 block group 的 block 數(shù)量 */</p><p>  un

28、signed __int16 s_inodes_per_group; /* 每 block group 的 inode 數(shù)量 */</p><p><b>  };</b></p><p><b>  //用戶密碼</b></p><p>  struct pwd{</p><p>  unsi

29、gned __int8 p_uid;</p><p>  unsigned __int8 p_gid;</p><p>  char username[UNAMSIZ];/*用戶名 新加的*/ </p><p>  char password[UPWDSIZ];</p><p><b>  };</b></p&g

30、t;<p><b>  //目錄結(jié)構(gòu)</b></p><p>  struct dir{</p><p>  struct direct direct[DIRNUM];</p><p>  __int16 size;</p><p><b>  };</b></p>&

31、lt;p>  2.3 全局變量和函數(shù)</p><p><b>  //全局變量</b></p><p>  unsigned __int8 di_bitmap[DINODENUM];// 硬盤inode節(jié)點(diǎn)位圖1表示已使用 0表示未使用</p><p>  unsigned __int8bk_bitmap[DATABLKNUM];

32、// 數(shù)據(jù)塊block位圖 </p><p>  struct super_block filsys;//超級塊</p><p>  struct pwd pwd[PWDNUM];</p><p>  FILE *fd;//文件指針</p><p>  struct inode *cur_inode;//

33、i節(jié)點(diǎn)當(dāng)前目錄指針</p><p>  struct inode *inodetemp;//i節(jié)點(diǎn)指針</p><p>  const char fsystemname[20]="Linux.EXT2";//模擬硬盤的文件名</p><p>  struct direct dir_buf[BLOCKSIZ / sizeof(stru

34、ct direct)];//目錄數(shù)組</p><p>  char cmdhead[20];//cmd 的頭 表示所在哪個(gè)文件夾、</p><p>  int i_lock=0;//inode位圖鎖 可能會多線程</p><p>  int b_lock=0;//block位圖鎖</p><p>  struct pwd *cur_use

35、r;</p><p>  /*全局函數(shù)*/</p><p>  extern intFormat();//格式化磁盤</p><p>  extern intInstall();//啟動(dòng),安裝文件系統(tǒng)</p><p>  struct inode * read_inode(int);//install里面讀取文件dinode&l

36、t;/p><p>  struct direct * read_dir_data(int);//讀取存儲文件夾的物理塊</p><p>  extern void showdir();//命令 dir</p><p>  int Enterdir(char[]);//進(jìn)入某個(gè)文件夾 命令-- cd 文件名</p><p>  int Fd_di

37、rfile(char[]);//查找當(dāng)前目錄里的文件 沒找到返回-1 找到返回inode號</p><p>  int Iscmd(char[]);//判斷是否兩個(gè)字符串的命令</p><p>  void two_cmd(char[],char[]);//兩個(gè)字符串的命令</p><p>  int creat(char[]);//創(chuàng)建文件</p>

38、<p>  void changeinode();//交換指針</p><p>  char * ReadFile(char[]);//讀取文件</p><p>  int mkdir(char[]);//創(chuàng)建文件夾</p><p>  void showbitmap();//顯示位圖</p><p>  int deletefd(

39、char[]);//刪除文件</p><p>  int editfile(char[]);//編輯文件</p><p>  int rename(char[]);//重命名</p><p>  void showhelp();//命令幫助</p><p>  void login();</p><p>  void

40、logout();</p><p>  int access();//權(quán)限判斷</p><p>  /*磁盤i節(jié)點(diǎn)的分配與釋放(當(dāng)一個(gè)新文件被建立的時(shí)候,在給該文件分配磁盤存儲區(qū)之前,</p><p>  應(yīng)為該文件分配存放該文件說明信息的磁盤i節(jié)點(diǎn),當(dāng)從文件系統(tǒng)中刪除某個(gè)文件時(shí),</p><p>  應(yīng)首先刪除它的磁盤i節(jié)點(diǎn)項(xiàng)。)*/ &l

41、t;/p><p>  intialloc();/*開辟一個(gè)空閑的i節(jié)點(diǎn),返回i節(jié)點(diǎn)*///磁盤塊分配與釋放函數(shù)</p><p>  intballoc(int);//申請硬盤空間</p><p><b>  2.4結(jié)構(gòu)體說明</b></p><p>  (1)硬盤模擬文件:每個(gè)數(shù)據(jù)塊512字節(jié),第一個(gè)數(shù)據(jù)塊空閑備用,

42、第2塊是超級塊,第3塊是inode位圖,第4塊是block位圖,第5塊開始有32塊是inode節(jié)點(diǎn),然后是數(shù)據(jù)區(qū)block,512塊。</p><p>  (2)超級塊:存放整個(gè)文件系統(tǒng)的基本狀態(tài),如:inode塊數(shù),block總塊數(shù),空閑的block計(jì)數(shù),空閑的inode計(jì)數(shù),每個(gè)數(shù)據(jù)塊組中的空閑塊數(shù)(為block分組,便于讀?。總€(gè)block的大樣(512字節(jié)),每個(gè)數(shù)據(jù)塊組的block塊數(shù)。</p&

43、gt;<p>  (3)Inode位圖:用一個(gè)數(shù)組來描述每個(gè)inode的使用狀況,1表示被占用,0表示空閑。</p><p>  (4)Block位圖:用一個(gè)數(shù)組來描述每個(gè)數(shù)據(jù)區(qū)的block的使用狀況,1表示被占用,0表示空閑。</p><p>  (5)inode節(jié)點(diǎn):inode記錄了文件或者目錄在數(shù)據(jù)區(qū)存放位置,是文件還是目錄,是否系統(tǒng)文件,屬于管理員組還是普通用戶組,是

44、由誰創(chuàng)建的,創(chuàng)建時(shí)間等。如果是目錄,則還記錄了里面包含多少個(gè)文件或子目錄。是文件則記錄了文件的大樣。讀取文件要先通過inode然后找到block,才能讀取。</p><p>  (6)Block數(shù)據(jù)塊:存放文件的地方,如果是目錄則記錄了這個(gè)目錄下所有的文件和子目錄的名稱和所占的inode,如果是文本文檔,則是字節(jié)流文件。</p><p>  第三章 功能模塊(或算法)描述</p&g

45、t;<p>  3.1 format 格式化</p><p>  只寫打開模擬文件,初始化超級快,初始化dinode位圖 block位圖,初始化主目錄,初始化etc目錄,初始化管理員admin 目錄,初始化用戶xiao 目錄,初始化 用戶passwd文件,寫入模擬硬盤文件。</p><p>  3.2 install 安裝</p><p>  讀寫打

46、開模擬文件,讀取dinode位圖 block位圖,讀取主目錄,讀取etc目錄,讀取管理員admin 目錄,讀取用戶xiao 目錄,讀取 用戶passwd文件。 </p><p>  3.3 login 登陸</p><p>  用戶輸入用戶名和密碼,在passwd文件中查找是否有此用戶,核對密碼。正確則登陸成功,當(dāng)前目錄設(shè)定到當(dāng)前用戶文件夾下。登錄流程圖3.2。</p>&l

47、t;p>  3.4 ialloc 申請inode空間</p><p>  先檢測inode位圖是否加鎖,是則退出。加鎖,檢測inode空間是否還有已滿,是則退出。在inode位圖中順序查找空閑的inode,找到則返回inode地址,block解鎖。函數(shù)結(jié)束。流程圖3.3。</p><p>  登錄流程圖3.2 ialloc 流程圖3.3balloc流程圖3.4<

48、/p><p>  3.5 balloc 申請block空間</p><p>  先檢測block位圖是否加鎖,是則退出。加鎖,檢測block空間是否還有k個(gè)空閑,否則退出。在還有空閑block的組中查找是否有k個(gè)空閑,沒有則去下一個(gè)block組中查找,找到則返回block地址,block解鎖。函數(shù)結(jié)束。流程圖3.4。</p><p>  3.6 create 創(chuàng)建文本文

49、件</p><p>  查找當(dāng)前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi)容,以‘###’結(jié)束。申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結(jié)束。將文件內(nèi)容寫入inode空間和block空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。如圖4所示:</p><p>  圖4 create創(chuàng)

50、建文本文件</p><p>  3.7 cdir 創(chuàng)建文件夾</p><p>  查找當(dāng)前目錄下是否有同名文件,是則退出,否則,申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結(jié)束。將文件夾內(nèi)容寫入inode空間和block空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。</p><p

51、>  [root\etc\yang\fxb]#cdir caobinhui</p><p>  1已經(jīng)找到空閑的block 7 它在第0組</p><p><b>  當(dāng)前目錄文件數(shù)3</b></p><p>  3.8 edit –讀取和追加文本文件</p><p>  Edit----調(diào)用讀取文件模塊,讀取成功

52、則用戶輸入追加的內(nèi)容,如果追加的內(nèi)容大于一個(gè)block則申請block空間,失敗則退出,申請成功則保存文件。</p><p>  3.9 access(文件名) 權(quán)限判斷</p><p>  先判斷當(dāng)前目錄是否有該文件,在當(dāng)前目錄的block找到該文件,判斷當(dāng)前登錄用戶是哪個(gè)組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級別。</p><p>  如果是該用戶創(chuàng)建的 則有

53、讀寫權(quán)限如果當(dāng)前用戶是管理員組的 也具有讀寫權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。</p><p>  3.10 cd –進(jìn)入子目錄 或上級目錄</p><p>  查找當(dāng)前目錄是否有該子目錄,沒有則退出,調(diào)用access()判斷當(dāng)前用戶是否有權(quán)限,無則退出,有則讀取該子目錄的inode,將當(dāng)前目錄指向該目錄。</p><p>  [root\etc\yang

54、]#cd fxb</p><p>  [root\etc\yang\fxb]#</p><p>  3.11 attr(文件名)查看文件或者文件夾的屬性</p><p>  先查找當(dāng)前目錄下是否有該文件或目錄,有則判斷文件是否系統(tǒng)文件,是否文本文件,是否目錄,由誰創(chuàng)建,屬于什么組,占用的block,和inode。將其全部顯示出來。</p><p&

55、gt;  3.12 del 刪除文件或目錄</p><p>  查找當(dāng)前目錄是否有該文件名,沒有則退出,有則調(diào)用access()判斷是否有權(quán)限,有則判斷是否為系統(tǒng)文件,是則無法刪除,不是則判斷是否是文件,是文件則直接刪除,不是則判斷是否文件夾,是文件夾則判斷該文件夾下是否有文件,有文件則無法刪除。提示用戶是否刪除,確認(rèn)則刪除文件,修改當(dāng)前文件夾inode,block結(jié)構(gòu),修改該文件占有的inode和block位圖

56、為0,修改超級塊,寫入模擬硬盤。</p><p>  [root\etc\yang\fxb]#del caobinhui</p><p>  是否真的要?jiǎng)h除 caobinhui ?<y/n>y</p><p><b>  0 7</b></p><p>  [root\etc\yang\fxb]#cd c

57、aobinhui</p><p>  未找到該文件!請輸入正確的文件或目錄名</p><p><b>  進(jìn)入目錄失敗!</b></p><p>  [root\etc\yang\fxb]#</p><p>  第四章 程序運(yùn)行結(jié)果</p><p>  4.1格式化 和登錄界面</p>

58、;<p>  登錄后顯示幫助信息 ,進(jìn)入到用戶文件夾下,如圖5所示:</p><p>  圖5 格式化及登錄界面</p><p>  4.2 ls命令---顯示當(dāng)前目錄下的文件和目錄</p><p>  [root\etc\yang\fxb]#ls</p><p>  . <

59、dir> inode 6</p><p>  .. <dir> inode 4</p><p>  [root\etc\yang\fxb]#</p><p>  4.3 logout命令---注銷用戶</p><p>  [root\etc]#logout</p>

60、<p><b>  用戶名:</b></p><p>  普通用戶無法進(jìn)入admin管理員目錄。</p><p><b>  第五章 心得體會</b></p><p>  操作系統(tǒng)課程設(shè)計(jì)是本課程重要的實(shí)踐教學(xué)環(huán)節(jié)。課程設(shè)計(jì)的目的,一方面使學(xué)生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一方面

61、,通過課程設(shè)計(jì)加強(qiáng)學(xué)生的實(shí)驗(yàn)手段與實(shí)踐技能,培養(yǎng)學(xué)生獨(dú)立分析問題、解決問題、應(yīng)用知識的能力和創(chuàng)新精神。與本課程的實(shí)驗(yàn)教學(xué)相比,課程設(shè)計(jì)獨(dú)立設(shè)課,具有更多的學(xué)時(shí),給學(xué)生更多自行設(shè)計(jì)、自主實(shí)驗(yàn)的機(jī)會,充分放手讓學(xué)生真正培養(yǎng)學(xué)生的實(shí)踐動(dòng)手能力,全面提高學(xué)生的綜合素質(zhì)。</p><p>  在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,遇到了過各種各樣的問題,同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了我們的不足之處,對以前所學(xué)過的知識理解得

62、不夠深刻,掌握得不夠牢固,不過在老師和同學(xué)們的幫助下設(shè)計(jì)終于順利完成了,對給過我們幫助的所有同學(xué)和各位指導(dǎo)老師再次表示忠心的感謝!</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 袁慶龍,候文義.Ni-P合金鍍層組織形貌及顯微硬度研究[J].太原理工大學(xué)學(xué)報(bào),2001,32(1):51-53.(連續(xù)出版物:[序號] 主要責(zé)任者.文獻(xiàn)題名[J]

63、.刊名,出版年份,卷號(期號):起止頁碼)</p><p>  [2] 劉國鈞,王連成.圖書館史研究[M].北京:高等教育出版社,1979:15-18,31.(專著:[序號] 主要責(zé)任者.文獻(xiàn)題名[M].出版地:出版者,出版年:起止頁碼.)</p><p>  [3] 孫品一.高校學(xué)報(bào)編輯工作現(xiàn)代化特征[C].中國高等學(xué)校自然科學(xué)學(xué)報(bào)研究會.科技編輯學(xué)論文集(2).北京:北京師范

64、大學(xué)出版社,1998:10-22.(論文集:[序號] 主要責(zé)任者.文獻(xiàn)題名[C]∥主編.論文集名.出版地:出版者,出版年:起止頁碼.)</p><p><b>  附:源代碼</b></p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p>

65、<p>  #include <malloc.h></p><p>  #include <string.h></p><p>  #include <dos.h></p><p>  #include <conio.h></p><p>  #define BLOCKSIZ

66、512//磁盤塊的大樣</p><p>  #define DATABLKNUM 512//數(shù)據(jù)塊的數(shù)目</p><p>  #define BLKGRUPNUM50//數(shù)據(jù)塊組包含多少數(shù)據(jù)塊</p><p>  #define P_N_BLOCKS15//inode節(jié)點(diǎn)中 指向數(shù)據(jù)塊的指針個(gè)數(shù)</p><p>  #d

67、efineGROUPNUMDATABLKNUM/BLKGRUPNUM+1 //數(shù)據(jù)塊組 組數(shù)</p><p>  #define DINODESIZ 512//磁盤i結(jié)點(diǎn)區(qū)的大樣(空間32×512)</p><p>  #define DINODENUM 32//磁盤i結(jié)點(diǎn)區(qū)的塊數(shù)</p><p>  #define SYSOPENFI

68、LE 40</p><p>  #define DIRNUM 32//一個(gè)目錄下的最多目錄和文件的總和數(shù)</p><p>  #define DIRSIZ 14//文件、目錄名的長度(字節(jié))</p><p>  #define UPWDSIZ 15//秘密的長度</p><p>  #define

69、UNAMSIZ 15//用戶名的長度</p><p>  #define PWDSIZsizeof(struct pwd) //密碼結(jié)構(gòu)的長度 </p><p>  #define PWDNUM BLOCKSIZ/PWDSIZ//密碼數(shù)據(jù)空間的大樣(pwd為單位)</p><p>  #define NOFILE

70、20//一個(gè)用戶最多可以打開的文件數(shù)目</p><p>  #define NHINO 128</p><p>  #define USERNUM 10//用戶名的長度</p><p>  #define DINODESTART 4*BLOCKSIZ//i結(jié)點(diǎn)區(qū)的開始地址-inodes table ,1引導(dǎo) 2超塊 3block bi

71、tmap 4inode bitmap </p><p>  #define DATASTART (2+DINODENUM)*BLOCKSIZ//數(shù)據(jù)區(qū)的開始地址</p><p>  #defineDATASTARTNO36//數(shù)據(jù)區(qū)開始指針</p><p>  /* di._mode */</p><p>  #define

72、 DIMODE_EMPTY00000/*可以用的空間*/</p><p>  #define DIMODE_FILE00001</p><p>  #define DIMODE_DIR 00002</p><p>  #define DIMODE_PASSWD00004</p><p>  #define DIMODE_SY

73、STEM00040/*系統(tǒng)文件*/</p><p>  #define DIMODE_READ 00010/* READ 和該數(shù)與操作后得到的是可以讀該文件的用戶組*/</p><p>  #define DIMODE_WRITE 00020/* WRITE */</p><p>  #define DIMODE_EXICUTE 01

74、000/* EXICUTE */</p><p>  #define DIMODE_ADMIN00100/*管理員權(quán)限*/</p><p>  #define DIMODE_SHARE00200/*不需要權(quán)限*/</p><p><b>  /*組*/</b></p><p>  #define GRUP_

75、00//管理員組</p><p>  #define GRUP_11</p><p>  #define GRUP_22</p><p>  #define GRUP_44</p><p>  /************************ 文件系統(tǒng) 數(shù)據(jù)結(jié)構(gòu) **********************

76、*********/</p><p>  /*————————————————————————</p><p><b>  磁盤i結(jié)點(diǎn)結(jié)構(gòu),</b></p><p>  ————————————————————————*/</p><p>  struct inode{</p><p>  //

77、 chardi_name[DIRSIZ];</p><p>  unsigned __int16 di_ino;/*磁盤i節(jié)點(diǎn)標(biāo)識*/</p><p>  unsigned __int16 di_number;/*關(guān)聯(lián)文件數(shù),當(dāng)為0時(shí)表示刪除文件*/</p><p>  unsigned __int16 di_mode;/*存取權(quán)限*/</

78、p><p>  unsigned __int16 di_uid;/*磁盤i節(jié)點(diǎn)用戶id*/</p><p>  unsigned __int16 di_gid;/*磁盤i節(jié)點(diǎn)權(quán)限組id*/ //1管理員組 2用戶組</p><p>  unsigned __int32 di_size;/*文件大樣*/</p><p>  unsign

79、ed __int32 di_ctime; /* Creation time */</p><p>  unsigned __int32 di_mtime; /* Modification time */</p><p>  unsigned __int16 di_block[P_N_BLOCKS]; /* 一組 block 指針 */</p><p>

80、<b>  };</b></p><p>  /*————————————————————————</p><p><b>  目錄項(xiàng)結(jié)構(gòu)</b></p><p>  ————————————————————————*/</p><p>  struct direct{</p><

81、;p>  chard_name[DIRSIZ];/*目錄名(14字節(jié))*/</p><p>  __int16 d_ino;/*目錄號*/</p><p><b>  };</b></p><p>  /*————————————————————————</p><p><b>  超級快結(jié)構(gòu)<

82、;/b></p><p>  ————————————————————————*/</p><p>  struct super_block{</p><p>  unsigned __int16 s_inodes_count; /* inodes 計(jì)數(shù) */</p><p>  unsigned __int16 s_bloc

83、ks_count; /* blocks 計(jì)數(shù) */</p><p>  unsigned __int16 s_r_blocks_count; /* 保留的 blocks 計(jì)數(shù) */</p><p>  unsigned __int16 s_free_blocks_count; // 空閑的 blocks 計(jì)數(shù) </p><p>  unsigned

84、__int16 s_free_inodes_count; /* 空閑的 inodes 計(jì)數(shù) */</p><p>  unsigned __int16 s_free_blocks_group[GROUPNUM];//新增 一個(gè)數(shù)組來記錄每個(gè)數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計(jì)數(shù) </p><p>  unsigned __int16 s_first_data_block; /* 第一個(gè)數(shù)據(jù) bloc

85、k */</p><p>  unsigned __int16 s_log_block_size; /* block 的大樣 */</p><p>  unsigned __int16 s_blocks_per_group; /* 每 block group 的 block 數(shù)量 */</p><p>  unsigned __int16 s_inodes_

86、per_group; /* 每 block group 的 inode 數(shù)量 */</p><p><b>  };</b></p><p>  /*————————————————————————</p><p><b>  用戶密碼</b></p><p>  ————————————————

87、————————*/</p><p>  struct pwd{</p><p>  unsigned __int8 p_uid;</p><p>  unsigned __int8 p_gid;</p><p>  char username[UNAMSIZ];/*用戶名 新加的*/ </p><p>  char

88、 password[UPWDSIZ];</p><p><b>  };</b></p><p>  /*————————————————————————</p><p><b>  目錄結(jié)構(gòu)</b></p><p>  ————————————————————————*/</p>&

89、lt;p>  struct dir{</p><p>  struct direct direct[DIRNUM];</p><p>  __int16 size;</p><p><b>  };</b></p><p><b>  //全局變量</b></p><p

90、>  unsigned __int8 di_bitmap[DINODENUM];// 硬盤inode節(jié)點(diǎn)位圖 1表示已使用 0表示未使用</p><p>  unsigned __int8bk_bitmap[DATABLKNUM];// 數(shù)據(jù)塊block位圖 </p><p>  struct super_block filsys;//超級塊</p>

91、<p>  struct pwd pwd[PWDNUM];</p><p>  //struct user user[USERNUM];</p><p>  //int usernum;</p><p>  FILE *fd;//文件指針</p><p>  struct inode *cur_inode;

92、//i節(jié)點(diǎn)當(dāng)前目錄指針</p><p>  //struct dinode *dinodef;//全局硬盤節(jié)點(diǎn)指針</p><p>  struct inode *inodetemp;//i節(jié)點(diǎn)指針</p><p>  //struct inode *inodetemp2;</p><p>  const cha

93、r fsystemname[20]="Linux.EXT2";//模擬硬盤的文件名</p><p>  struct direct dir_buf[BLOCKSIZ / sizeof(struct direct)];//目錄數(shù)組</p><p>  char cmdhead[20];//cmd 的頭 表示所在哪個(gè)文件夾、</p><p>

94、;  int i_lock=0;//inode位圖鎖 可能會多線程</p><p>  int b_lock=0;//block位圖鎖</p><p>  struct pwd *cur_user;</p><p>  /*全局函數(shù)*/</p><p>  extern intFormat();//格式化磁盤</p>

95、<p>  extern intInstall();//啟動(dòng),安裝文件系統(tǒng)</p><p>  struct inode * read_inode(int);//install里面讀取文件dinode</p><p>  struct direct * read_dir_data(int);//讀取存儲文件夾的物理塊</p><p>  extern

96、 void showdir();//命令 dir</p><p>  int Enterdir(char[]);//進(jìn)入某個(gè)文件夾 命令-- cd 文件名</p><p>  int Fd_dirfile(char[]);//查找當(dāng)前目錄里的文件 沒找到返回-1 找到返回inode號</p><p>  int Iscmd(char[]);//判斷是否兩個(gè)字符串的命

97、令</p><p>  void cmd_Up(char[],char[]);//兩個(gè)字符串的命令</p><p>  int creat(char[]);//創(chuàng)建文件</p><p>  void changeinode();//交換指針</p><p>  char * ReadFile(char[]);//讀取文件</p>

98、<p>  int cdir(char[]);//創(chuàng)建文件夾</p><p>  void showbitmap();//顯示位圖</p><p>  int deletefd(char[]);//刪除文件</p><p>  int editfile(char[]);//編輯文件</p><p>  int rename(cha

99、r[]);//重命名</p><p>  void showhelp();//命令幫助</p><p>  void login();</p><p>  void logout();</p><p>  int access();//權(quán)限判斷</p><p>  /*磁盤i節(jié)點(diǎn)的分配與釋放(當(dāng)一個(gè)新文件被建立的時(shí)候,

100、在給該文件分配磁盤存儲區(qū)之前,</p><p>  應(yīng)為該文件分配存放該文件說明信息的磁盤i節(jié)點(diǎn),當(dāng)從文件系統(tǒng)中刪除某個(gè)文件時(shí),</p><p>  應(yīng)首先刪除它的磁盤i節(jié)點(diǎn)項(xiàng)。)*/ </p><p>  intialloc();/*開辟一個(gè)空閑的i節(jié)點(diǎn),返回i節(jié)點(diǎn)*/</p><p>  //磁盤塊分配與釋放函數(shù)</p>

101、<p>  intballoc(int);//申請硬盤空間</p><p>  void showaccess(char strname[20]);</p><p>  //內(nèi)存i節(jié)點(diǎn)的獲取與釋放 </p><p>  //extern struct inode *iget(unsigned int);/*獲取hino位置的i節(jié)點(diǎn),返回i節(jié)點(diǎn)指針*/

102、</p><p>  //extern void iput(struct inode* );/*將i節(jié)點(diǎn) 釋放或是寫入磁盤*/</p><p><b>  //#endif</b></p><p>  void main()</p><p><b>  {</b></p>&l

103、t;p>  char str[10];</p><p>  char strname[10];</p><p><b>  char c;</b></p><p>  printf("是否格式化?<y/n>");</p><p>  scanf("%c",&

104、;c);</p><p>  fflush(stdin);</p><p>  if(c=='y')</p><p><b>  {</b></p><p>  if(!Format())</p><p><b>  {</b></p><

105、p><b>  return;</b></p><p><b>  }</b></p><p>  printf("格式化完畢!\n");</p><p><b>  }</b></p><p>  if(!Install())</p>

106、<p><b>  {</b></p><p><b>  return;</b></p><p><b>  }</b></p><p>  printf("login.................\n");</p><p><b>

107、;  login();</b></p><p>  showhelp();</p><p>  printf("%s>",cmdhead);</p><p><b>  while(1)</b></p><p><b>  {</b></p>&l

108、t;p>  scanf("%s",&str);</p><p>  if(strcmp(str,"exit")==0)</p><p><b>  {</b></p><p>  fclose(fd);</p><p><b>  return;</b

109、></p><p><b>  }</b></p><p>  elseif(strcmp(str,"dir")==0)</p><p><b>  {</b></p><p>  showdir();</p><p><b>  }&l

110、t;/b></p><p>  else if(strcmp(str,"bit")==0)</p><p><b>  {</b></p><p>  showbitmap();</p><p><b>  }</b></p><p>  else

111、if(strcmp(str,"help")==0)</p><p><b>  {</b></p><p>  showhelp();</p><p><b>  }</b></p><p>  else if(strcmp(str,"logout")==0)

112、</p><p><b>  {</b></p><p><b>  logout();</b></p><p><b>  }</b></p><p>  elseif(Iscmd(str))</p><p><b>  {</b&g

113、t;</p><p>  scanf("%s",&strname);</p><p>  cmd_Up(str,strname);</p><p><b>  }</b></p><p><b>  else</b></p><p><b&g

114、t;  {</b></p><p>  printf("錯(cuò)誤命令!\n");</p><p><b>  }</b></p><p>  printf("%s>",cmdhead);</p><p><b>  }</b></p>

115、<p><b>  }</b></p><p>  //---------------------------格式化------------</p><p>  int Format()</p><p><b>  {</b></p><p>  struct pwd passwd [

116、BLOCKSIZ/PWDSIZ];</p><p><b>  int i;</b></p><p>  /*creat the file system file */</p><p>  fd = fopen (fsystemname, "wb");/*讀寫創(chuàng)建一個(gè)二進(jìn)制文件*/</p><p>

117、  if(fd==NULL)</p><p><b>  {</b></p><p>  printf("硬盤模擬文件創(chuàng)建失敗!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p>

118、<p><b>  //超級塊</b></p><p>  filsys.s_inodes_count=DINODENUM ; /* inodes 計(jì)數(shù) */</p><p>  filsys.s_blocks_count=DATABLKNUM; /* blocks 計(jì)數(shù) */</p><p>  filsys.

119、s_r_blocks_count=0; /* 保留的 blocks 計(jì)數(shù) */</p><p>  filsys. s_free_blocks_count=DATABLKNUM-5; /* 空閑的 blocks 計(jì)數(shù) */</p><p>  filsys.s_free_blocks_group[0]=50-5;//第一個(gè)block group 已經(jīng)被用了5個(gè)</p>

120、<p>  for(i=1;i<GROUPNUM-1;i++)</p><p><b>  {</b></p><p>  filsys.s_free_blocks_group[i]=50; //后面的group 全部空閑</p><p>  //printf("block group %d 空閑個(gè)數(shù)為%d\n&qu

121、ot;,i,filsys.s_free_blocks_group[i]);</p><p><b>  }</b></p><p>  filsys.s_free_blocks_group[GROUPNUM-1]=12;//最后一個(gè)block組 只有12個(gè)block</p><p>  filsys.s_free_inodes_count=DI

122、NODENUM-5; /* 空閑的 inodes 計(jì)數(shù) */</p><p>  filsys.s_first_data_block=DATASTARTNO; /* 第一個(gè)數(shù)據(jù) block 也就是*/</p><p>  filsys.s_log_block_size=BLOCKSIZ; /* block 的大樣 */</p><p>  filsys.s_

123、blocks_per_group=BLKGRUPNUM; /* 每 block group 的 block 數(shù)量 */</p><p>  filsys.s_inodes_per_group=0; //每 block group 的 inode 數(shù)量 暫未使用</p><p>  fseek(fd, BLOCKSIZ, SEEK_SET);</p><p> 

124、 fwrite (&filsys,BLOCKSIZ, 1,fd);</p><p>  //初始化dinode位圖 block位圖</p><p>  di_bitmap[0]=1;</p><p>  di_bitmap[1]=1;</p><p>  di_bitmap[2]=1;//前三個(gè)inode 分別被 root etc 用

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論