在Linux環(huán)境下模擬實現(xiàn)命令解釋器_第1頁
在Linux環(huán)境下模擬實現(xiàn)命令解釋器_第2頁
在Linux環(huán)境下模擬實現(xiàn)命令解釋器_第3頁
在Linux環(huán)境下模擬實現(xiàn)命令解釋器_第4頁
在Linux環(huán)境下模擬實現(xiàn)命令解釋器_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)課程設(shè)計在Linux環(huán)境下模擬實現(xiàn)命令解釋器專業(yè)計算機科學與技術(shù)學生姓名班級學號任課教師完成日期2014年1月目 錄一、課程設(shè)計的目的、要求3二、課程設(shè)計的內(nèi)容4(1)題目選擇4(2)系統(tǒng)功能要求4(3)具體功能的實現(xiàn)4(4)課程設(shè)計步驟4 (5) 課程設(shè)計內(nèi)容5(一) 概念原理5(二)詳細設(shè)計6(三) 運行結(jié)果6(四)主要代碼7三、課程設(shè)計小結(jié)12一、課程設(shè)計的目的、要求【目的】:本課程設(shè)計是學生學習完linux操作系統(tǒng)課程后,進行的一次全面的綜合訓(xùn)練,通過課程設(shè)計,讓學生更好地掌握linux操作系統(tǒng)的原理及實現(xiàn)方法,加深對操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加強學生的動手能力。【要求

2、】:從課程設(shè)計的目的出發(fā),通過設(shè)計工作的各個環(huán)節(jié),達到以下教學要求:2人一組,每組從所給題目中任選一個(如自擬題目,需經(jīng)指導(dǎo)教師同意),每個學生必須獨立完成課程設(shè)計,不能相互抄襲,同組者文檔不能相同;設(shè)計完成后,將所完成的工作交由指導(dǎo)教師檢查;要求寫出一份詳細的設(shè)計報告。二、課程設(shè)計的內(nèi)容(1)題目選擇在Linux環(huán)境下模擬實現(xiàn)命令解釋器(2)系統(tǒng)功能要求1、定義 mydir 具有dir 的功能2、定義 mycd 具有cd 的功能3、定義 mycopy 具有cp 的功能4、定義 mydel 具有del 的功能(3)具體功能的實現(xiàn)本程序在不使用system()系統(tǒng)調(diào)用的前提下實現(xiàn)了某些Linux

3、環(huán)境下的系統(tǒng)自帶功能,如:1、mydir命令是列出當前目錄中的所有目錄及文件 輸入格式:mydir2、mycd命令是改變當前工作目錄 輸入格式:mycd <目錄名或路徑>3、mycopy命令是復(fù)制文件的功能 輸入格式:mycopy <文件1><文件2>4、mydel命令是刪除所輸入的目錄 輸入格式:mydel <目錄名>5、exit命令是退出命令解釋程序 輸入格式:exit(4)課程設(shè)計步驟1、新建一個gwz目錄,mkdir gwz2、進入gwz目錄3、進入vim命令編輯器,新建一個gwz.c文件,vim gwz.c4、輸入代碼5、編譯gwz.c

4、文件,gcc -o gwz gwz.c6、運行程序./gwz (5) 課程設(shè)計內(nèi)容(1) 概念原理該命令解析器程序運用了C+與C語言相結(jié)合完成了題目所要求的幾種功能,并充分調(diào)用了外部函數(shù)實現(xiàn)各項功能。如下是程序中運用到較為重要的幾個函數(shù):1、調(diào)用getcwd()函數(shù)函數(shù)原型:char * getcwd(char * buf,size_t size);函數(shù)說明:getcwd()會將當前的工作目錄絕對路徑復(fù)制到參數(shù)buf所指的內(nèi)存空間,參數(shù)size為buf的空間大小。在調(diào)用此函數(shù)時,buf所指的內(nèi)存空間要足夠大,若工作目錄絕對路徑的字符串長度超過參數(shù)size大小,則回值NULL,errno的值則為

5、ERANGE。倘若參數(shù)buf為NULL,getcwd()會依參數(shù)size的大小自動配置內(nèi)存(使用malloc(),如果參數(shù)size也為0,則getcwd()會依工作目錄絕對路徑的字符串程度來決定所配置的內(nèi)存大小,進程可以在使用完此字符串后利用free()來釋放此空間。返回值:執(zhí)行成功則將結(jié)果復(fù)制到參數(shù)buf所指的內(nèi)存空間,或是返回自動配置的字符串指針。失敗返回NULL,錯誤代碼存于errno。2、調(diào)用opendir()函數(shù)函數(shù)原型:DIR * opendir(const char * name);函數(shù)說明:opendir()用來打開參數(shù)name指定的目錄,并返回DIR*形態(tài)的目錄流,和open

6、()類似,接下來對目錄的讀取和搜索都要使用此返回值。返回值:成功則返回DIR* 型態(tài)的目錄流,打開失敗則返回NULL。3、readdir()函數(shù)語法:struct dirent* readdir(DIR* dir_handle); 返回值:dirent結(jié)構(gòu) 函數(shù)種類:文件存取 內(nèi)容說明:本函數(shù)用來讀取目錄。返回是dirent結(jié)構(gòu)體指針。4、在mycd()函數(shù)里用到了chdir()函數(shù),chdir 是C語言中的一個系統(tǒng)調(diào)用函數(shù)(同cd)函數(shù)名稱:_chdir(在TC2.0下可以寫作chdir)功 能: 改變當前工作目錄頭文件:direct.h(在TC2.0下為dir.h)用 法: int _ch

7、dir(const char *path);返回值:成功返回0 ,失敗返回-1當成功改變當前目錄時則返回0,若目錄不存在或改變不成功時返回-1。(二)詳細設(shè)計程序的每個功能基本都有由一個函數(shù)來實現(xiàn)。1、int ReadCommand(void)/讀取命令2、int ParseCommand(void)/對輸入的命令進行解析3、int ExcuteCommand(void)/執(zhí)行命令4、int mydir(void)/dir命令5、int mycd(void)/改變當前文件夾6、int mycopy(void)/復(fù)制文件7、int mydel(void)/deldir命令具體實現(xiàn)代碼請見附錄。(

8、3) 運行結(jié)果1、當輸入./gwz后進入該命令解釋器,下圖為該解釋器的首界面 2、按照首界面的提示輸入mydir后則屏幕顯示如下,列出當前目錄中的所有目錄及文件。 3、輸入mycd 111后改變目錄成功,輸入mycd aaaa后則顯示目錄不存在。 4、 輸入mycopy命令成功復(fù)制文件。 5、輸入mydel成功刪除目錄,但不能刪除文件。(四)主要代碼#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/stat.h&g

9、t;#include <sys/types.h>#include <dirent.h>#include <sys/wait.h>char command_str256;/存儲輸入的命令串char param_list20256;/儲存分析好的命令串int ReadCommand(void);int ParseCommand(void);int ExcuteCommand(void);int mycopy(void);int mycd(void);int mydel(void);int mydir(void);void exit();int ReadComma

10、nd(void)/讀取命令char c;int i=0;while (scanf("%c",&c)!=EOF && c!='n' && i<256)/從輸入串中逐個讀取字符,當遇到結(jié)尾或換行或讀取的字符已達到字符串的總長度時結(jié)束command_stri=c;i+;command_stri=0;/字符串后加“0”表示結(jié)束return 0;int ParseCommand(void)/對輸入的命令進行解析unsigned int i=0,j=0,n=0;int blank_flag=1;/初始化為前面有分割符,為0時

11、表示前面沒有分割符for (i=0;i<strlen(command_str);i+) /依次掃描命令串的每個字符if (command_stri=' '| command_stri='t')/分割符出現(xiàn)if (blank_flag=0) /此字符前面的字符不是分隔符param_listnj=0;/在此字符后加上“0”表示字符結(jié)束n+;j=0;blank_flag=1;else /字符不為結(jié)束符param_listnj=command_stri;/把字符儲存起來j+;blank_flag=0;if (blank_flag=1)/當輸入的字符串最后一個字符為

12、分割符時會出現(xiàn)的特殊情況param_listn0=0;/標識param_list的結(jié)束elseparam_listnj=0;n+;param_listn0=0;return 1;int ExcuteCommand(void)/執(zhí)行命令 if (strcmp("mycd",param_list0)=0) /如果是mycdmycd();return 0;if (strcmp("mydel",param_list0)=0) /如果是mydelmydel();return 0;if (strcmp("mydir",param_list0)=0

13、) /如果是mydirmydir();return 0;if(strcmp("mycopy",param_list0)=0)/如果是mycopymycopy();return 0;if(strcmp("exit",param_list0)=0)/如果是exitexit(0);int mycopy(void)/復(fù)制文件 char sourcepath255;/被復(fù)制文件路徑,舊的 char aimpath255;/復(fù)制的文件路徑,新的 FILE *newfp;/ 復(fù)制的文件指針,新的 FILE *oldfp;/被復(fù)制的文件指針,舊的 char ch;/復(fù)制

14、內(nèi)容時用的載體 getcwd(sourcepath,255);/ 將當前工作目錄的絕對路徑復(fù)制到參數(shù)sourcepath所指的內(nèi)存空間中,255為soucerpath的空間大小 getcwd(aimpath,255);/同上 strcat(sourcepath,"/");/將字符串“/”添加到sourcepath結(jié)尾處 strcat(sourcepath,param_list1);/將字符串(即被復(fù)制的文件名)添加到sourcepath結(jié)尾處 strcat(aimpath,"/"); strcat(aimpath,param_list2); /將字符串(

15、即需要復(fù)制的文件名)添加到aimpath結(jié)尾處 if(oldfp=fopen(sourcepath,"r")=NULL)/以只讀方式打開被復(fù)制文件,如果打開失敗進行提示 printf("不能打開指定文件!n"); if(newfp=fopen(aimpath,"w")=NULL)/以只寫方式打開被復(fù)制文件,如果打開失敗進行提示 printf("新建文件失敗!n"); while(ch=fgetc(oldfp)!=EOF)/從被復(fù)制文件中逐個讀取字符,如果讀到文件末尾結(jié)束 fputc(ch,newfp);/把ch里的

16、字符儲存在新的文件里 fclose(oldfp);/關(guān)閉文件 fclose(newfp); printf("成功的把文件從 %s 復(fù)制到 %s !n",sourcepath,aimpath);int mycd(void)/改變當前文件夾if (strcmp("",param_list1)=0)/ cd后不帶參數(shù)return -1;if (chdir(param_list1)=-1) /改變目錄失敗printf("目錄不存在!n");return -1;return 0;int mydel(void)/deldir命令if (strcm

17、p("",param_list1)=0) /命令不帶參數(shù)printf("命令參數(shù)錯誤!n");return -1;if (rmdir(param_list1)=-1) /刪除目錄失敗printf("刪除目錄失敗!n");return -1;elseprintf("刪除目錄成功!n");return 0;int mydir(void)/dir命令DIR* dirp;struct dirent * ent;if (strcmp("",param_list1)=0)/命令不帶參數(shù)dirp=opendi

18、r(".");/打開當前工作目錄elsedirp=opendir(param_list1);/打開目錄if (dirp=NULL) /如果打開目錄失敗printf("打開目錄失敗!n");return -1;while (ent=readdir(dirp)!=NULL) /依次讀取目錄的信息if (ent->d_name0!='.')printf("%st",ent->d_name);/%s表示數(shù)據(jù)輸出類型為字符串printf("n");closedir(dirp);/關(guān)閉目錄return 0;int main(int argc,char*argv) printf("*n");printf("* 在Linux環(huán)境下模擬實現(xiàn)命令解釋器 *n");printf("* 計算機116班 *n");printf("* 1110704606 *n");printf("* 管維舟 *n");printf("*n");

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論