版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
操作系統(tǒng)課程設(shè)計(jì)在Linux環(huán)境下模擬實(shí)現(xiàn)命令解釋器專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生姓名班級學(xué)號任課教師完成日期2014年1月目錄TOC\o"1-3"\h\u4702一、課程設(shè)計(jì)的目的、要求 二、課程設(shè)計(jì)的內(nèi)容(1)題目選擇在Linux環(huán)境下模擬實(shí)現(xiàn)命令解釋器(2)系統(tǒng)功能要求1、定義mydir具有dir的功能2、定義mycd具有cd的功能3、定義mycopy具有cp的功能4、定義mydel具有del的功能(3)具體功能的實(shí)現(xiàn)本程序在不使用system()系統(tǒng)調(diào)用的前提下實(shí)現(xiàn)了某些Linux環(huán)境下的系統(tǒng)自帶功能,如:1、mydir命令是列出當(dāng)前目錄中的所有目錄及文件輸入格式:mydir2、mycd命令是改變當(dāng)前工作目錄輸入格式:mycd<目錄名或路徑>3、mycopy命令是復(fù)制文件的功能輸入格式:mycopy<文件1><文件2>4、mydel命令是刪除所輸入的目錄輸入格式:mydel<目錄名>5、exit命令是退出命令解釋程序輸入格式:exit(4)課程設(shè)計(jì)步驟1、新建一個(gè)gwz目錄,mkdirgwz2、進(jìn)入gwz目錄3、進(jìn)入vim命令編輯器,新建一個(gè)gwz.c文件,vimgwz.c4、輸入代碼5、編譯gwz.c文件,gcc-ogwzgwz.c6、運(yùn)行程序./gwz(5)課程設(shè)計(jì)內(nèi)容概念原理該命令解析器程序運(yùn)用了C++與C語言相結(jié)合完成了題目所要求的幾種功能,并充分調(diào)用了外部函數(shù)實(shí)現(xiàn)各項(xiàng)功能。如下是程序中運(yùn)用到較為重要的幾個(gè)函數(shù):1、調(diào)用getcwd()函數(shù)函數(shù)原型:char*getcwd(char*buf,size_tsize);函數(shù)說明:getcwd()會(huì)將當(dāng)前的工作目錄絕對路徑復(fù)制到參數(shù)buf所指的內(nèi)存空間,參數(shù)size為buf的空間大小。在調(diào)用此函數(shù)時(shí),buf所指的內(nèi)存空間要足夠大,若工作目錄絕對路徑的字符串長度超過參數(shù)size大小,則回值NULL,errno的值則為ERANGE。倘若參數(shù)buf為NULL,getcwd()會(huì)依參數(shù)size的大小自動(dòng)配置內(nèi)存(使用malloc()),如果參數(shù)size也為0,則getcwd()會(huì)依工作目錄絕對路徑的字符串程度來決定所配置的內(nèi)存大小,進(jìn)程可以在使用完此字符串后利用free()來釋放此空間。返回值:執(zhí)行成功則將結(jié)果復(fù)制到參數(shù)buf所指的內(nèi)存空間,或是返回自動(dòng)配置的字符串指針。失敗返回NULL,錯(cuò)誤代碼存于errno。2、調(diào)用opendir()函數(shù)函數(shù)原型:DIR*opendir(constchar*name);函數(shù)說明:opendir()用來打開參數(shù)name指定的目錄,并返回DIR*形態(tài)的目錄流,和open()類似,接下來對目錄的讀取和搜索都要使用此返回值。返回值:成功則返回DIR*型態(tài)的目錄流,打開失敗則返回NULL。3、readdir()函數(shù)語法:structdirent*readdir(DIR*dir_handle);返回值:dirent結(jié)構(gòu)函數(shù)種類:文件存取內(nèi)容說明:本函數(shù)用來讀取目錄。返回是dirent結(jié)構(gòu)體指針。4、在mycd()函數(shù)里用到了chdir()函數(shù),chdir是C語言中的一個(gè)系統(tǒng)調(diào)用函數(shù)(同cd)函數(shù)名稱:_chdir(在TC2.0下可以寫作chdir)功能:改變當(dāng)前工作目錄頭文件:direct.h(在TC2.0下為dir.h)用法:int_chdir(constchar*path);返回值:成功返回0,失敗返回-1當(dāng)成功改變當(dāng)前目錄時(shí)則返回0,若目錄不存在或改變不成功時(shí)返回-1。(二)詳細(xì)設(shè)計(jì)程序的每個(gè)功能基本都有由一個(gè)函數(shù)來實(shí)現(xiàn)。1、intReadCommand(void)//讀取命令2、intParseCommand(void)//對輸入的命令進(jìn)行解析3、intExcuteCommand(void)//執(zhí)行命令4、intmydir(void)//dir命令5、intmycd(void)//改變當(dāng)前文件夾6、intmycopy(void)//復(fù)制文件7、intmydel(void)//deldir命令具體實(shí)現(xiàn)代碼請見附錄。運(yùn)行結(jié)果1、當(dāng)輸入./gwz后進(jìn)入該命令解釋器,下圖為該解釋器的首界面2、按照首界面的提示輸入 mydir后則屏幕顯示如下,列出當(dāng)前目錄中的所有目錄及文件。3、輸入mycd111后改變目錄成功,輸入mycdaaaa后則顯示目錄不存在。輸入mycopy命令成功復(fù)制文件。5、輸入mydel成功刪除目錄,但不能刪除文件。(四)主要代碼#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>#include<dirent.h>#include<sys/wait.h>charcommand_str[256]; //存儲(chǔ)輸入的命令串charparam_list[20][256];//儲(chǔ)存分析好的命令串intReadCommand(void);intParseCommand(void);intExcuteCommand(void);intmycopy(void);intmycd(void);intmydel(void);intmydir(void);voidexit();intReadCommand(void)//讀取命令{ charc; inti=0; while(scanf("%c",&c)!=EOF&&c!='\n'&&i<256)//從輸入串中逐個(gè)讀取字符,當(dāng)遇到結(jié)尾或換行或讀取的字符已達(dá)到字符串的總長度時(shí)結(jié)束 {command_str[i]=c; i++; } command_str[i]=0;//字符串后加“0”表示結(jié)束 return0;}intParseCommand(void)//對輸入的命令進(jìn)行解析{ unsignedinti=0,j=0,n=0; intblank_flag=1;//初始化為前面有分割符,為0時(shí)表示前面沒有分割符 for(i=0;i<strlen(command_str);i++)//依次掃描命令串的每個(gè)字符 { if(command_str[i]==''||command_str[i]=='\t')//分割符出現(xiàn) { if(blank_flag==0)//此字符前面的字符不是分隔符 { param_list[n][j]=0;//在此字符后加上“0”表示字符結(jié)束 n++; j=0; blank_flag=1; } } else//字符不為結(jié)束符 { param_list[n][j]=command_str[i];//把字符儲(chǔ)存起來 j++; blank_flag=0; } } if(blank_flag==1) //當(dāng)輸入的字符串最后一個(gè)字符為分割符時(shí)會(huì)出現(xiàn)的特殊情況 param_list[n][0]=0;//標(biāo)識param_list的結(jié)束 else { param_list[n][j]=0; n++; param_list[n][0]=0; } return1;}intExcuteCommand(void)//執(zhí)行命令{ if(strcmp("mycd",param_list[0])==0)//如果是mycd { mycd(); return0; } if(strcmp("mydel",param_list[0])==0)//如果是mydel { mydel(); return0; } if(strcmp("mydir",param_list[0])==0)//如果是mydir { mydir(); return0; } if(strcmp("mycopy",param_list[0])==0) //如果是mycopy { mycopy(); return0; } if(strcmp("exit",param_list[0])==0) //如果是exit { exit(0); }}intmycopy(void)//復(fù)制文件{charsourcepath[255];//被復(fù)制文件路徑,舊的charaimpath[255];//復(fù)制的文件路徑,新的FILE*newfp;//復(fù)制的文件指針,新的FILE*oldfp;//被復(fù)制的文件指針,舊的charch; //復(fù)制內(nèi)容時(shí)用的載體getcwd(sourcepath,255);//將當(dāng)前工作目錄的絕對路徑復(fù)制到參數(shù)sourcepath所指的內(nèi)存空間中,255為soucerpath的空間大小getcwd(aimpath,255);//同上strcat(sourcepath,"/");//將字符串“/”添加到sourcepath結(jié)尾處strcat(sourcepath,param_list[1]);//將字符串(即被復(fù)制的文件名)添加到sourcepath結(jié)尾處strcat(aimpath,"/");strcat(aimpath,param_list[2]);//將字符串(即需要復(fù)制的文件名)添加到aimpath結(jié)尾處if((oldfp=fopen(sourcepath,"r"))==NULL)//以只讀方式打開被復(fù)制文件,如果打開失敗進(jìn)行提示{printf("不能打開指定文件!\n");}if((newfp=fopen(aimpath,"w"))==NULL)//以只寫方式打開被復(fù)制文件,如果打開失敗進(jìn)行提示{printf("新建文件失敗!\n");}while((ch=fgetc(oldfp))!=EOF)//從被復(fù)制文件中逐個(gè)讀取字符,如果讀到文件末尾結(jié)束{fputc(ch,newfp);//把ch里的字符儲(chǔ)存在新的文件里}fclose(oldfp);//關(guān)閉文件fclose(newfp);printf("成功的把文件從%s復(fù)制到%s!\n",sourcepath,aimpath);}intmycd(void)//改變當(dāng)前文件夾{ if(strcmp("",param_list[1])==0)//cd后不帶參數(shù) return-1; if(chdir(param_list[1])==-1)//改變目錄失敗 { printf("目錄不存在!\n"); return-1; } return0;}intmydel(void)//deldir命令{ if(strcmp("",param_list[1])==0)//命令不帶參數(shù) { printf("命令參數(shù)錯(cuò)誤!\n"); return-1; } if(rmdir(param_list[1])==-1)//刪除目錄失敗 { printf("刪除目錄失敗!\n"); return-1; } else printf("刪除目錄成功!\n"); return0;}intmydir(void)//dir命令{ DIR*dirp; structdirent*ent; if(strcmp("",param_list[1])==0)//命令不帶參數(shù) dirp=opendir(".");//打開當(dāng)前工作目錄 else dirp=opendir(param_list[1]);//打開目錄 if(dirp==NULL)//如果打開目錄失敗 { printf("打開目錄失敗!\n"); return-1; } while((ent=readdir(dirp))!=NULL)//依次讀取目錄的信息 { if(ent->d_name[0]!='.') printf("%s\t",ent->d_name);//%s表示數(shù)據(jù)輸出類型為字符串 } printf("\n"); closedir(dirp);//關(guān)閉目錄 return0;}intmain(intargc,char*argv[]){printf("**************************************************\n");printf("***在Linux環(huán)境下模擬實(shí)現(xiàn)命令解釋器***\n");printf("***計(jì)算機(jī)116班***\n");printf("***1110704606***\n");printf("***管維舟***\n");printf("******************************
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年邵陽學(xué)院馬克思主義基本原理概論期末考試題含答案解析(必刷)
- 2025年鄭州工商學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析(奪冠)
- 2024年郎溪縣招教考試備考題庫附答案解析(奪冠)
- 2025年天津師范大學(xué)津沽學(xué)院馬克思主義基本原理概論期末考試模擬題帶答案解析(必刷)
- 2025年河南財(cái)政金融學(xué)院馬克思主義基本原理概論期末考試模擬題含答案解析(必刷)
- 2025年隆林各族自治縣幼兒園教師招教考試備考題庫帶答案解析(奪冠)
- 2025年四川國際標(biāo)榜職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題帶答案解析
- 2025年蘭州外語職業(yè)學(xué)院單招職業(yè)技能測試題庫帶答案解析
- 2025年寧鄉(xiāng)縣幼兒園教師招教考試備考題庫含答案解析(必刷)
- 2025年榕江縣招教考試備考題庫及答案解析(奪冠)
- 市政設(shè)施巡查及維護(hù)方案
- 大型活動(dòng)安保工作預(yù)案模板
- 2025年文化遺產(chǎn)數(shù)字化保護(hù)與開發(fā):技術(shù)創(chuàng)新與經(jīng)濟(jì)效益研究報(bào)告
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會(huì)成熟人才招聘備考題庫及答案詳解參考
- 南瑞9622型6kV變壓器差動(dòng)保護(hù)原理及現(xiàn)場校驗(yàn)實(shí)例培訓(xùn)課件
- 統(tǒng)編版(2024)七年級上冊道德與法治期末復(fù)習(xí)必背知識點(diǎn)考點(diǎn)清單
- 山西焦煤考試題目及答案
- 2026年春節(jié)放假前員工安全培訓(xùn)
- (2025版)成人肺功能檢查技術(shù)進(jìn)展及臨床應(yīng)用指南解讀課件
- 《春秋》講解課件
- 青少年抑郁障礙的護(hù)理與康復(fù)訓(xùn)練
評論
0/150
提交評論