操作系統(tǒng)課程設(shè)計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課程設(shè)計報告</b></p><p>  2011-2012學(xué)年 第一學(xué)期</p><p>  目 錄</p><p>  1.設(shè)計思想說明1</p><p>  2.系統(tǒng)結(jié)構(gòu)說明1</p><p>  3.數(shù)據(jù)結(jié)構(gòu)說明2</p>&

2、lt;p><b>  3.1開發(fā)環(huán)境2</b></p><p><b>  3.2數(shù)據(jù)存儲2</b></p><p><b>  3.3數(shù)據(jù)結(jié)構(gòu)2</b></p><p>  3.3.1數(shù)據(jù)塊在內(nèi)存中的物理結(jié)構(gòu)2</p><p>  3.3.2文件索引結(jié)構(gòu)2&l

3、t;/p><p>  3.3.3文件系統(tǒng)中文件元素的結(jié)構(gòu)(含文件夾和文件)3</p><p>  3.3.4文件系統(tǒng)結(jié)構(gòu)3</p><p>  3.3.5文件系統(tǒng)的當(dāng)前運行狀態(tài)3</p><p>  3.3.6用戶結(jié)構(gòu)4</p><p>  4.各主要模塊的算法流程圖4</p><p> 

4、 4.1整體思路概述4</p><p>  4.1.1login (用戶登錄)4</p><p>  4.1.2系統(tǒng)初始化5</p><p>  4.1.3文件的創(chuàng)建: create5</p><p>  4.1.4文件的打開:open6</p><p>  4.1.5文件的讀:read7</p>

5、;<p>  4.1.6文件的寫:write8</p><p>  4.1.7文件關(guān)閉:close10</p><p>  4.1.8刪除文件:delete10</p><p>  4.1.9創(chuàng)建目錄(建立子目錄):mkdir11</p><p>  4.1.10改變當(dāng)前目錄:cd12</p><p

6、>  4.1.11列出文件目錄:dir14</p><p>  4.1.12退出:logout15</p><p>  4.2算法流程圖15</p><p>  5.使用說明書15</p><p><b>  5.1登錄15</b></p><p>  5.2新建目錄和列出文件目錄

7、16</p><p>  5.3改變當(dāng)前目錄16</p><p>  5.4文件的創(chuàng)建16</p><p>  5.5文件的打開17</p><p>  5.6文件的寫17</p><p>  5.7文件的讀17</p><p>  5.8文件的關(guān)閉17</p>&l

8、t;p>  5.9文件的刪除17</p><p>  5.10返回根目錄18</p><p><b>  5.11退出18</b></p><p><b>  6.總結(jié)18</b></p><p><b>  參考文獻19</b></p><

9、p><b>  課程設(shè)計題目名稱</b></p><p><b>  設(shè)計思想說明</b></p><p>  本課程設(shè)計要求設(shè)計一個模擬的多用戶多級目錄的文件系統(tǒng)。通過具體的文件存儲空間的管理、文件的物理結(jié)構(gòu)、目錄結(jié)構(gòu)和文件操作的實現(xiàn),加深對文件系統(tǒng)內(nèi)部功能和實現(xiàn)過程的理解。</p><p><b>  

10、系統(tǒng)結(jié)構(gòu)說明</b></p><p>  2.1在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲器,在其上實現(xiàn)一個多用戶多目錄的文件系統(tǒng)。</p><p>  2.2文件物理結(jié)構(gòu)可采用顯式鏈接或其他方法。</p><p>  2.3磁盤空閑空間的管理可選擇位示圖或其他方法。如果采用位示圖來管理文件存儲空間,并采用顯式鏈接分配方式,則可以將位示圖合并到FAT中。&

11、lt;/p><p>  2.4文件目錄結(jié)構(gòu)采用多用戶多級目錄結(jié)構(gòu),每個目錄項包含文件名、物理地址、長度等信息,還可以通過目錄項實現(xiàn)對文件的讀和寫的保護。</p><p>  2.5設(shè)計一個較實用的用戶界面,方便用戶使用。要求提供以下相關(guān)文件操作:</p><p>  2.5.1具有l(wèi)ogin (用戶登錄)</p><p>  2.5.2系統(tǒng)初始化

12、(建文件卷、提供登錄模塊)</p><p>  2.5.3文件的創(chuàng)建: create</p><p>  2.5.4文件的打開:open</p><p>  2.5.5文件的讀:read</p><p>  2.5.6文件的寫:write</p><p>  2.5.7文件關(guān)閉:close</p><

13、;p>  2.5.8刪除文件:delete </p><p>  2.5.9創(chuàng)建目錄(建立子目錄):mkdir</p><p>  2.5.10改變當(dāng)前目錄:cd</p><p>  2.5.11列出文件目錄:dir</p><p>  2.5.12退出:logout</p><p><b>  數(shù)據(jù)結(jié)

14、構(gòu)說明</b></p><p><b>  3.1開發(fā)環(huán)境</b></p><p>  Visual C++6.0下的win32控制臺程序,C語言。</p><p><b>  3.2數(shù)據(jù)存儲</b></p><p>  在內(nèi)存中申請1M的空間來模擬存取設(shè)備,空間劃分為三部分,第一部分用

15、來存放位示圖,用于標(biāo)識數(shù)據(jù)塊的使用情況,第二部分放置一個文件索引的數(shù)據(jù),用于快速的查找數(shù)據(jù),第三部分放置數(shù)據(jù)信息,第三部分劃分為512塊,每塊512B,其256K,放置在1M空間的最末端,由第三部分的大小可知,第一部分只需64B即可,中間的部分用來存放文件索引。其他用到的存儲單元由系統(tǒng)分配。</p><p><b>  3.3數(shù)據(jù)結(jié)構(gòu)</b></p><p>  3.

16、3.1數(shù)據(jù)塊在內(nèi)存中的物理結(jié)構(gòu)</p><p>  typedef struct fb</p><p><b>  {</b></p><p>  unsigned FileBlockId;//文件塊編號</p><p>  unsigned BLOCK_SIZE; //文件塊的容量</p>&

17、lt;p>  char *FileBlockAddr; //文件塊地址</p><p>  struct fb *next; //下一個文件塊的地址</p><p>  } FileBlock;</p><p>  3.3.2文件索引結(jié)構(gòu)</p><p>  typedef struct </p><

18、p><b>  {</b></p><p>  unsigned Index;//文件元素索引編號</p><p>  char FileName[NAME_LEN]; //文件元素名</p><p>  char ParentName[NAME_LEN]; //父節(jié)點名</p>&

19、lt;p>  unsigned FileBlockId;//文件元素所在物理塊編號</p><p>  unsigned FileLevel; //文件元素所在層次,層+文件元素</p><p>  名為一個文件元素邏輯位置</p><p>  unsigned effect; //是否有效,0-無效,1-有效&l

20、t;/p><p>  } FileIndexElement;</p><p>  3.3.3文件系統(tǒng)中文件元素的結(jié)構(gòu)(含文件夾和文件)</p><p>  typedef struct fse</p><p><b>  {</b></p><p>  struct fse *parent;

21、 //指向自己的父親節(jié)點</p><p>  unsigned FileLevel; //文件元素所在層次,層+文件元素名</p><p>  為一個文件元素的邏輯位置</p><p>  char FileName[NAME_LEN]; //文件元素名</p><p>  unsigned FileBlockId;/

22、/文件元素所在物理塊編號</p><p>  unsigned FileElemLen;//文件元素的長度</p><p>  FileType Type;//文件元素類型</p><p>  FileAccess Access;//文件元素可供操作的權(quán)限</p><p>  User Creator;//

23、文件創(chuàng)建者</p><p>  char CreateTime[18];//創(chuàng)建時間,日期格式:MM/DD/YY HH:MI:SS</p><p>  char LastModTime[18];//最后一次修改時間</p><p>  char *FileData;//一個文件的數(shù)據(jù)開始地址,文件夾時該值為NULL</p><

24、p>  FileStatus fileStu;//如果是一個文件表示文件當(dāng)前的狀態(tài)</p><p>  } FSElement;</p><p>  3.3.4文件系統(tǒng)結(jié)構(gòu)</p><p>  typedef struct </p><p><b>  {</b></p><p> 

25、 char *FSStart;//文件系統(tǒng)的起始地址</p><p>  unsigned SuperBlockSize; //文件系統(tǒng)的容量</p><p>  BitMap bm;//文件系統(tǒng)中的位示圖</p><p>  unsigned BLOCK_COUNT;//文件系統(tǒng)中文件塊的數(shù)量</p><p&

26、gt;  FileBlock *head;//文件系統(tǒng)中文件塊首地址</p><p>  FileIndex FI;//文件系統(tǒng)中的文件索引</p><p>  } SuperBlock;</p><p>  3.3.5文件系統(tǒng)的當(dāng)前運行狀態(tài)</p><p>  typedef struct</p><p

27、><b>  {</b></p><p>  User CurrentUser;//當(dāng)前用戶</p><p>  unsigned FileLevel;//用戶所在文件系統(tǒng)層</p><p>  FSElement *CurrParent;//當(dāng)前層的父節(jié)點</p><p>  char *C

28、urrentPath;//當(dāng)前路徑</p><p>  } CurrentStatus;</p><p><b>  3.3.6用戶結(jié)構(gòu)</b></p><p>  typedef struct </p><p><b>  {</b></p><p>  char

29、*UserName;//用戶名稱</p><p>  UserType ut;//用戶類型</p><p><b>  } User;</b></p><p>  各主要模塊的算法流程圖</p><p><b>  4.1整體思路概述</b></p><p&g

30、t;  首先系統(tǒng)要完成初始化的任務(wù),建立一個系統(tǒng),并等待用戶登錄使用文件系統(tǒng),用戶登錄系統(tǒng)時,系統(tǒng)對用戶的用戶名和密碼進行驗證(允許用戶用限次的嘗試,多最多嘗試五次),如果用戶登錄成功,則系統(tǒng)進入命令提示符狀態(tài),等用戶輸入指令后,系統(tǒng)得用一個解釋程序按照指定方式處理用戶請求,用戶退出后,系統(tǒng)轉(zhuǎn)入登錄模塊,等待下一位用戶的登錄。</p><p>  4.1.1login (用戶登錄)</p><

31、p>  內(nèi)置9個用戶名和密碼,用來驗證登錄用戶的身份,用戶登錄成功后會初始化當(dāng)前用戶等一系列的系統(tǒng)當(dāng)前信息,默認(rèn)用戶的類型為普通用戶,如果用戶未能通過身份驗證,提示用戶登錄失敗,退出整個系統(tǒng)。</p><p><b>  用戶登錄流程圖</b></p><p>  4.1.2系統(tǒng)初始化</p><p>  系統(tǒng)的初始化要完成文件系統(tǒng)的建立

32、,包括以下幾部分:請求內(nèi)存、設(shè)置位示圖、初始化文件索引、初始化文本塊鏈表、初始化系統(tǒng)的當(dāng)前狀態(tài)、創(chuàng)建一個根目錄做為系統(tǒng)的根。</p><p>  4.1.3文件的創(chuàng)建: create</p><p>  只支持在當(dāng)前目錄創(chuàng)建文件,根據(jù)位示圖找到一個未使用的文件塊用來存放用戶的文件信息,根據(jù)系統(tǒng)當(dāng)前狀態(tài)來構(gòu)建一個文件系統(tǒng)元素放入到找到的文件塊中,新創(chuàng)建的文件狀態(tài)為關(guān)閉,同時更新位示圖和文件索

33、引。</p><p><b>  文件創(chuàng)建流程圖</b></p><p>  void Create(char *filename)</p><p><b>  {</b></p><p>  if (strcmp(filename, "") == 0)</p>&

34、lt;p><b>  {</b></p><p>  printf("對不起,文件名不能為空。\n");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b>

35、</p><p>  CreateFileElement(protect, filename, file, NULL, CS.CurrParent);</p><p><b>  }</b></p><p>  printf("[%s@localhost %s]$", CS.CurrentUser.UserName, CS.

36、CurrentPath);</p><p><b>  }</b></p><p>  4.1.4文件的打開:open</p><p>  只支持在當(dāng)前目錄進行操作,通過用戶給定的文件名在文件索引中搜索到文件的物理文件塊ID,找到該文件元素后,將文件當(dāng)前狀態(tài)置為打開。</p><p><b>  打開文件流程圖

37、</b></p><p>  void Open(char *path)</p><p><b>  {</b></p><p>  char display[100];</p><p>  for (unsigned i = 0; i < FS.FI.FICount; i++)</p>

38、<p><b>  {</b></p><p>  if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName) </p><p>  && FS.FI.FIStart[i].FileLevel == CS.FileLevel </p><p&g

39、t;  && FS.FI.FIStart[i].effect == 1 </p><p>  && strcmp(FS.FI.FIStart[i].FileName, path) == 0)</p><p><b>  {</b></p><p>  FSElement *fselem = (FSElement

40、*)</p><p>  FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId);</p><p>  fselem->fileStu = opened;</p><p>  strcpy(display, "文件已打開完畢。\n");</p><p><b>  

41、break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (strcmp(display, "") == 0)</p><p><b>  {</b></p>&

42、lt;p>  strcpy(display, "當(dāng)前目錄下沒有您要打開的文件。\n");</p><p><b>  }</b></p><p>  printf("%s\n", display);</p><p>  printf("[%s@localhost %s]$", C

43、S.CurrentUser.UserName, CS.CurrentPath);</p><p><b>  }</b></p><p>  4.1.5文件的讀:read</p><p>  只支持在當(dāng)前目錄進行操作,前提是用戶已執(zhí)行文件打開的命令,否則會提示用戶先打開文件。通過類似的查找方式,找到文件的數(shù)據(jù)部分,將數(shù)據(jù)顯示到界面。</p

44、><p><b>  讀文件流程圖</b></p><p>  void Read(char *path)</p><p><b>  {</b></p><p>  char display[BLOCK_SIZE];</p><p>  for (unsigned i = 0;

45、 i < FS.FI.FICount; i++)</p><p><b>  {</b></p><p>  if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName) </p><p>  && FS.FI.FIStart[i].FileLev

46、el == CS.FileLevel </p><p>  && FS.FI.FIStart[i].effect == 1 </p><p>  &&strcmp(FS.FI.FIStart[i].FileName, path) == 0)</p><p><b>  {</b></p><

47、p>  FSElement *fselem = (FSElement *)</p><p>  FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId);</p><p>  if (fselem->fileStu == closed)</p><p><b>  {</b></p>

48、;<p>  strcpy(display, "文件尚未打開,請先打開文件。\n");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if (!

49、fselem->FileData || !strcmp(fselem->FileData, ""))</p><p><b>  {</b></p><p>  strcpy(display, "文件無內(nèi)容。\n");</p><p><b>  }</b></p&

50、gt;<p><b>  else</b></p><p><b>  {</b></p><p>  strcpy(display, fselem->FileData);</p><p><b>  }</b></p><p>  fselem->

51、;fileStu = reading;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

52、  if (strcmp(display, "") == 0)</p><p><b>  {</b></p><p>  strcpy(display, "當(dāng)前目錄下沒有您要打開的文件。\n");</p><p><b>  }</b></p><p>  

53、printf("%s\n", display);</p><p>  printf("[%s@localhost %s]$", CS.CurrentUser.UserName, CS.CurrentPath);</p><p><b>  }</b></p><p>  4.1.6文件的寫:write&l

54、t;/p><p>  只支持在當(dāng)前目錄進行操作,前提是用戶已執(zhí)行文件打開的命令,否則會提示用戶先打開文件。命令成功后,會等待用戶的輸入,用戶輸入完畢,使用CTRL+D,結(jié)束輸入,系統(tǒng)會讀入用戶的輸入內(nèi)容,保存到相應(yīng)的文件塊(注意,如果用戶的輸入太多,會出現(xiàn)越界或截取用戶輸入一部分的現(xiàn)象)。</p><p>  void Write(char *path)</p><p>

55、;<b>  {</b></p><p>  char display[BLOCK_SIZE];</p><p>  memset(display, '\0', BLOCK_SIZE);</p><p>  for (unsigned i = 0; i < FS.FI.FICount; i++)</p>&l

56、t;p><b>  {</b></p><p>  if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName) </p><p>  && FS.FI.FIStart[i].FileLevel == CS.FileLevel </p><p>

57、  && FS.FI.FIStart[i].effect == 1 </p><p>  && strcmp(FS.FI.FIStart[i].FileName, path) == 0)</p><p><b>  {</b></p><p>  FSElement *fselem = (FSElement *)

58、</p><p>  FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId);</p><p>  if (fselem->fileStu == closed)</p><p><b>  {</b></p><p>  strcpy(display, "文件尚未

59、打開,請先打開文件。\n");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("\n注意:文件最大不可以超過 %d 字節(jié)?。“碈TRL+D結(jié)&l

60、t;/p><p>  束編輯。\n", BLOCK_SIZE - sizeof(FSElement));</p><p><b>  char c;</b></p><p>  int i = 0;</p><p>  while ((c = getchar()) != 0x04)</p><p

61、><b>  {</b></p><p>  display[i++] = c;</p><p><b>  }</b></p><p>  getchar();//處理回車</p><p>  display[i] = '\0';</p><p> 

62、 strcpy(fselem->FileData, display);</p><p>  unsigned len=strlen(display)<BLOCK_SIZE - sizeof(FSElement)</p><p>  ? strlen(display) : BLOCK_SIZE - sizeof(FSElement);</p><p>

63、  strncpy(fselem->FileData, display, len);</p><p>  fselem->fileStu = writing;</p><p>  strcpy(display, "文件寫入成功。\n");</p><p><b>  }</b></p><

64、;p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("%s\n", display);</p><p>  printf("[%s@loca

65、lhost %s]$", CS.CurrentUser.UserName, CS.CurrentPath);</p><p><b>  }</b></p><p>  4.1.7文件關(guān)閉:close</p><p>  只支持在當(dāng)前目錄進行操作,通過用戶給定的文件名在文件索引中搜索到文件的物理文件塊ID,找到該文件元素后,將文件當(dāng)前

66、狀態(tài)置為關(guān)閉。</p><p>  void Close(char *path)</p><p><b>  {</b></p><p>  char display[100];</p><p>  for (unsigned i = 0; i < FS.FI.FICount; i++)</p>&l

67、t;p><b>  {</b></p><p>  if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName) </p><p>  && FS.FI.FIStart[i].FileLevel == CS.FileLevel </p><p>

68、  && FS.FI.FIStart[i].effect == 1 </p><p>  && strcmp(FS.FI.FIStart[i].FileName, path) == 0)</p><p><b>  {</b></p><p>  FSElement *fselem = (FSElement *)

69、</p><p>  FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId);</p><p>  fselem->fileStu = opened;</p><p>  strcpy(display, "文件已關(guān)閉。\n");</p><p><b>  brea

70、k;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (strcmp(display, "") == 0)</p><p><b>  {</b></p><p

71、>  strcpy(display, "當(dāng)前目錄下沒有您要關(guān)閉的文件。\n");</p><p><b>  }</b></p><p>  printf("%s\n", display);</p><p>  printf("[%s@localhost %s]$", CS.Cu

72、rrentUser.UserName, CS.CurrentPath);</p><p><b>  }</b></p><p>  4.1.8刪除文件:delete</p><p>  刪除文件并不真正清理文件的物理存儲內(nèi)容,只是將文件的有效狀態(tài)更改為無效。</p><p><b>  刪除文件流程圖<

73、/b></p><p>  void Delete(char *path)</p><p><b>  {</b></p><p>  char display[100] = "";</p><p>  for (unsigned i = 0; i < FS.FI.FICount; i++

74、)</p><p><b>  {</b></p><p>  if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName) </p><p>  && FS.FI.FIStart[i].FileLevel == CS.FileLevel </p&

75、gt;<p>  && FS.FI.FIStart[i].effect == 1 </p><p>  &&strcmp(FS.FI.FIStart[i].FileName, path) == 0)</p><p><b>  {</b></p><p>  FS.FI.FIStart[i].ef

76、fect = 0;//刪除標(biāo)記</p><p>  strcpy(display, "文件已刪除。\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p>

77、;<p>  if (strcmp(display, "") == 0)</p><p><b>  {</b></p><p>  strcpy(display, "當(dāng)前目錄下沒有您要刪除的文件。\n");</p><p><b>  }</b></p>

78、<p>  printf("%s\n", display);</p><p>  printf("[%s@localhost %s]$", CS.CurrentUser.UserName, CS.CurrentPath);</p><p><b>  }</b></p><p>  4.1.9

79、創(chuàng)建目錄(建立子目錄):mkdir</p><p>  只支持在當(dāng)前目錄創(chuàng)建文件,與創(chuàng)建文件有點類似,只是文件夾在文件元素結(jié)構(gòu)中的數(shù)據(jù)部分為空。同樣會更新位示圖和文件索引。</p><p><b>  創(chuàng)建目錄流程圖</b></p><p>  void Mkdir(char *filename)</p><p><

80、;b>  {</b></p><p>  if (strcmp(filename, "") == 0)</p><p><b>  {</b></p><p>  printf("對不起,文件夾名不能為空。\n");</p><p><b>  }<

81、;/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  CreateFileElement(protect, filename, dir, NULL, CS.CurrParent);</p><p><b>  }</

82、b></p><p>  printf("[%s@localhost %s]$", CS.CurrentUser.UserName, CS.CurrentPath);</p><p><b>  }</b></p><p>  4.1.10改變當(dāng)前目錄:cd</p><p>  只支持進入下一層

83、的一個文件夾和回到父目錄,實現(xiàn)方式為通過系統(tǒng)的當(dāng)前狀態(tài),獲取一個指向目標(biāo)文件夾的指針做為當(dāng)前的父節(jié)點,改變當(dāng)前的路徑為目標(biāo)路徑,改變用戶當(dāng)前所在層。</p><p><b>  改變當(dāng)前目錄流程圖</b></p><p>  void Cd(char *path)</p><p><b>  {</b></p>

84、<p>  int splitDisplayCou = 0;//分割符出現(xiàn)的次數(shù)</p><p>  if(strcmp(path, "..") == 0) //返回上一級目錄,即父目錄</p><p><b>  {</b></p><p>  if (CS.FileLevel > 0)</p

85、><p><b>  {</b></p><p>  CS.FileLevel--;</p><p>  CS.CurrParent = CS.CurrParent->parent;</p><p>  for (unsigned i = strlen(CS.CurrentPath) - 1; i > 0; i-

86、-)</p><p><b>  {</b></p><p>  if (CS.CurrentPath[i] == '/')</p><p><b>  {</b></p><p>  splitDisplayCou++;</p><p>  if (spli

87、tDisplayCou == 2)//已過濾掉最后一個目錄名</p><p><b>  {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p>

88、<p><b>  }</b></p><p>  char temppath[1000] ;</p><p>  strcpy(temppath, CS.CurrentPath);</p><p>  memset(CS.CurrentPath, '\0', 1000);</p><p>  

89、strncpy(CS.CurrentPath, temppath, i+1);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p

90、><p>  char display[100] = "";</p><p>  for (unsigned i = 0; i < FS.FI.FICount; i++)</p><p><b>  {</b></p><p>  if(!strcmp(FS.FI.FIStart[i].Parent

91、Name, CS.CurrParent->FileName)</p><p>  && FS.FI.FIStart[i].FileLevel == CS.FileLevel </p><p>  && FS.FI.FIStart[i].effect == 1 </p><p>  && strcmp(FS.FI

92、.FIStart[i].FileName, path) == 0)</p><p><b>  {</b></p><p>  strcpy(display, "文件存在。\n");</p><p>  CS.CurrParent = (FSElement *)</p><p>  FindBlank

93、FileBlock(FS.FI.FIStart[i].FileBlockId);</p><p>  CS.FileLevel++;</p><p>  strcat(CS.CurrentPath, path);</p><p>  strcat(CS.CurrentPath, "/");</p><p><b&g

94、t;  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (strcmp(display, "") == 0)//文件夾不存在,什么都不做</p><p><b>  {<

95、/b></p><p>  printf("當(dāng)前目錄下沒有您要進入的文件夾。\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("[%s@localhost %s]$", CS.C

96、urrentUser.UserName, CS.CurrentPath);</p><p><b>  }</b></p><p>  4.1.11列出文件目錄:dir</p><p>  只支持在當(dāng)前目錄進行操作,根據(jù)文件元素的名稱+文件元素所在層+父節(jié)點可以唯一的標(biāo)識一個文件元素的關(guān)系在文件索引中搜索出當(dāng)前層的所有文件元素。</p&g

97、t;<p>  void Dir(char *path)</p><p><b>  {</b></p><p>  char display[1000];</p><p>  memset(display, '\0', 1000);</p><p><b>  //查找顯示內(nèi)容&

98、lt;/b></p><p>  for (unsigned i = 0; i < FS.FI.FICount; i++)</p><p><b>  {</b></p><p>  if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName) </p

99、><p>  && FS.FI.FIStart[i].FileLevel == CS.FileLevel </p><p>  && FS.FI.FIStart[i].effect == 1)</p><p><b>  {</b></p><p>  strcat(display, FS.F

100、I.FIStart[i].FileName);</p><p>  strcat(display, "\t\t");</p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("%s\n", displa

101、y);</p><p>  printf("[%s@localhost %s]$", CS.CurrentUser.UserName, CS.CurrentPath);</p><p><b>  }</b></p><p>  4.1.12退出:logout</p><p>  用戶請求退出時,跳出

102、命令處理,提示用戶退出系統(tǒng),轉(zhuǎn)入到登錄模塊等待下一個用戶的登錄。</p><p><b>  4.2算法流程圖</b></p><p><b>  算法流程圖</b></p><p><b>  使用說明書</b></p><p><b>  5.1登錄</b&

103、gt;</p><p>  內(nèi)置設(shè)了user1到user8八個普通用戶和1個超級用戶root,密碼與用戶名相同。登錄時如果輸入用戶名和密碼錯誤次數(shù)多于8次,則退出程序。輸入密碼時采用了一種不回顯的方式,雖然屏幕上沒有顯示輸入的密碼,其實密碼已經(jīng)輸入了系統(tǒng),這樣做可以提高系統(tǒng)的安全性。現(xiàn)在用超級用戶root登錄后出現(xiàn)如下界面:/表示根目錄,$后面可以輸入命令。</p><p><b&g

104、t;  圖5.1</b></p><p>  5.2新建目錄和列出文件目錄</p><p>  由于第一次啟動系統(tǒng),故根目錄下沒有任何東西,這點可以通過輸入命令dir來驗證,故為了演示,先建立一個目錄hhh,在$后輸入命令,mkdir hhh,按回車,然后再用命令dir查看根目錄下信息,此時有一個文件hhh,如下:</p><p><b>  

105、圖5.2</b></p><p><b>  5.3改變當(dāng)前目錄</b></p><p>  系統(tǒng)啟動后,默認(rèn)路徑為根目錄/,此時若要進入剛才新建的目錄hhh,只需輸入命令cd hhh,結(jié)果如下:路徑已由原來的/變成了/hhh/</p><p><b>  圖5.3</b></p><p&g

106、t;<b>  5.4文件的創(chuàng)建</b></p><p>  在目錄hhh下新建一個名為h的文件,在$后輸入命令create h,再用命令dir列出文件:</p><p><b>  圖5.4</b></p><p><b>  5.5文件的打開</b></p><p>  用

107、命令open h打開文件h:</p><p><b>  圖5.5</b></p><p><b>  5.6文件的寫</b></p><p>  先輸入命令write h,再輸入文字:Idle brain is the devil’s workshop.</p><p><b>  圖5

108、.6</b></p><p><b>  5.7文件的讀</b></p><p>  執(zhí)行命令read h可以讀取文件h的內(nèi)容:</p><p><b>  圖5.7</b></p><p><b>  5.8文件的關(guān)閉</b></p><p&g

109、t;  執(zhí)行命令close h關(guān)閉文件h:</p><p><b>  圖5.8</b></p><p><b>  5.9文件的刪除</b></p><p>  執(zhí)行命令delete h刪除文件h:</p><p><b>  圖5.9</b></p><

110、p><b>  5.10返回根目錄</b></p><p>  執(zhí)行命令cd ..,路徑由/hhh變成了/</p><p><b>  圖5.10</b></p><p><b>  5.11退出</b></p><p>  執(zhí)行命令logout,退出系統(tǒng),可以以其他用戶

111、名進行登錄</p><p><b>  總結(jié)</b></p><p>  在設(shè)計的過程中遇到問題,可以說得是困難重重,同時在設(shè)計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固,通過這次課程設(shè)計之后,一定把以前所學(xué)過的知識重新溫故。這次課程設(shè)計終于順利完成了,在設(shè)計中遇到了很多編程問題,最后在通過運用豐富的網(wǎng)絡(luò)資源,終于游逆而解。<

112、/p><p><b>  參考文獻</b></p><p>  [1] 計算機操作系統(tǒng)(第三版), 湯子丹等 ,西安電子科技大學(xué)出版社, 2007</p><p>  [2] Linux內(nèi)核完全剖析,趙炯,機械工業(yè)出版社,2006</p><p>  [3] 操作系統(tǒng)課程設(shè)計,羅宇 褚瑞等,機械工業(yè)出版社,2005</

溫馨提示

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

最新文檔

評論

0/150

提交評論