




已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
系統(tǒng)軟件課程設計實驗報告專業(yè) 計算機科學與技術 姓名 胡偉強 班級 計121 學號 10123522 教師 葉 琪 華東理工大學信息科學與工程學院2015年6 月20 日一.課程設計題目Shell編程二.課程設計成員胡偉強 計121 10123522三.課程設計內(nèi)容和要求學習如何編寫一個Linux的外殼Shell,即命令解釋程序。學習怎樣接受命令、解釋命令、執(zhí)行命令,特別是采用創(chuàng)建子進程的方式來執(zhí)行一個程序,以及父進程如何繼續(xù)子進程的工作。要求:1、編寫一個C語言程序作為Linux內(nèi)核的shell命令行解釋程序,所執(zhí)行的結(jié)果需和系統(tǒng)命令行方式保持一致。2、對用戶編寫的shell增加后臺運行功能。即用戶可以使用”&”作為一個命令結(jié)束,以啟動下一個命令。3、修改程序,增加I/O重定向功能。即用戶可以使用”和”|”符號改變程序/文件的輸入和輸出。四. 軟件系統(tǒng)設計terminal_prompt()函數(shù)read_command()函數(shù)Parsing()函數(shù)main()函數(shù)execute()函數(shù)調(diào)用builtin_command()函數(shù)child_process_handler()函數(shù)parse_info_init()函數(shù)1、函數(shù)調(diào)用圖:2、 函數(shù)功能說明:函數(shù)名功能說明void execute(void)執(zhí)行函數(shù),程序的主體Void child_process_handler(int sig)處理后臺運行進程函數(shù),用于清除后臺運行的子進程,以防其變成僵尸進程void terminal_prompt(char*)終端提示符函數(shù)int read_command(char *,char *,char*)讀取命令函數(shù),從用戶輸入中讀取命令和參數(shù),分別放入command和parameters中,作為exec族函數(shù)執(zhí)行。int parsing(char *,int,struct parse_info *)語法分析函數(shù),主要處理后臺執(zhí)行,重定向,管道功能實現(xiàn)int parse_info_init(struct parse_info *info)初始化結(jié)構(gòu)體struct parse_info *infoint builtin_command(char *command, char *parameters)內(nèi)建命令函數(shù),實現(xiàn)了exit、cd、help命令5. 算法設計1. 程序框架#define TRUE 1while(TRUE) type_prompt();read_command(command,parameters); if(fork()!=0) /* Parent code */waitpid(-1,&status,0); else /* Child code */execve(command,parameters,0);2.程序主體功能execute()函數(shù)的實現(xiàn)#include myshell.hvoid execute(void) int status,i; char *command = NULL;/命令 char *parameters;/參數(shù) int ParaNum;/參數(shù)個數(shù) char promptMAX_PROMPT;/提示 struct parse_info info; pid_t ChdPid,ChdPid2; parameters = malloc(sizeof(char *)*(MAXARG+2); buffer = malloc(sizeof(char) * MAXLINE); if(parameters = NULL | buffer = NULL)/內(nèi)存分配失敗 printf(mysh error:malloc failed.n); return; if(signal(SIGCHLD,child_process_handler) = SIG_ERR)/父進程調(diào)用將SIGCHLD綁定到sig_handler()函數(shù),這樣fork出來的子進程在終止時會自動清理掉 perror(signal() error); while(TRUE) int pipe_fd2,in_fd,out_fd; terminal_prompt(prompt);/終端提示符函數(shù) ParaNum = read_command(&command,parameters,prompt);/讀入命令 if(-1 = ParaNum) continue; ParaNum-;/命令數(shù)減一 parsing(parameters,ParaNum,&info);/對于后臺執(zhí)行、管道、重定向的初始化操作 if(builtin_command(command,parameters)/內(nèi)建命令 continue; if(info.flag & IS_PIPED) /管道 if(pipe(pipe_fd)0)/pipe_fd0:讀管道;pipe_fd1:寫管道 printf(mysh error:pipe failed.n); exit(0); if(ChdPid = fork()!=0) /mysh主進程 if(info.flag & IS_PIPED) if(ChdPid2=fork() = 0) /要求管道進程必須為mysh進程的子進程 close(pipe_fd1); close(fileno(stdin); dup2(pipe_fd0, fileno(stdin); close(pipe_fd0); if(execvp(mand2,info.parameters2)=-1)printf(%sn,strerror(errno); else close(pipe_fd0); close(pipe_fd1); waitpid(ChdPid2,&status,0); /wait command2 if(info.flag & BACKGROUND)/后臺執(zhí)行 printf(后臺進程pid:%un,ChdPid); int i; for(i=0;iMAXPIDTABLE;i+) if(child_process_pidi=0) child_process_pidi = ChdPid; /存儲子進程號break; if(i=MAXPIDTABLE) printf(Too much background processesnThere will be zombine process); else waitpid(ChdPid,&status,0);/等待命令1結(jié)束 else /mysh的子進程 if(info.flag & IS_PIPED) /命令2不為空 if(!(info.flag & OUT_REDIRECT) / 僅管道 close(pipe_fd0); close(fileno(stdout); dup2(pipe_fd1, fileno(stdout); close(pipe_fd1); else /輸出重定向和管道 close(pipe_fd0); close(pipe_fd1);/關閉管道,發(fā)送一個EOF信號給command2 if(info.flag & OUT_REDIRECT) out_fd = open(info.out_file, O_WRONLY|O_CREAT|O_TRUNC, 0666); else out_fd = open(info.out_file, O_WRONLY|O_APPEND|O_TRUNC, 0666); close(fileno(stdout); dup2(out_fd, fileno(stdout); close(out_fd); else if(info.flag & OUT_REDIRECT) / 僅輸出重定向 out_fd = open(info.out_file, O_WRONLY|O_CREAT|O_TRUNC, 0666); close(fileno(stdout); dup2(out_fd, fileno(stdout); close(out_fd); if(info.flag & IN_REDIRECT)/輸入重定向 in_fd = open(info.in_file, O_CREAT |O_RDONLY, 0666);/0666表示, 擁有者,組,其他人都擁有可讀可寫權限 close(fileno(stdin); dup2(in_fd, fileno(stdin); close(in_fd); if(execvp(command,parameters)=-1)printf(%sn,strerror(errno); free(parameters);/釋放parameters free(buffer);/釋放buffer6. 上機實現(xiàn)情況及運行結(jié)果(包括中間和最終結(jié)果)1、編譯mysh,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國益母草顆粒產(chǎn)業(yè)銷售態(tài)勢及消費趨勢研究報告
- 2025至2030中國疲勞管理軟件行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 《護理文書》考核試卷(附答案)
- 采陶方法培訓課件
- 教育技術在高校課程建設中的應用案例
- 智慧課堂教育心理學引領的教學模式創(chuàng)新
- 教育政策與人才培養(yǎng)的關聯(lián)性研究
- 抖音商戶直播銷售額達成通報制度
- 公交優(yōu)先政策與城市交通擁堵治理:2025年交通擁堵治理的公共交通優(yōu)先政策實施路徑研究
- Benzoyl-coenzyme-A-sodium-Benzoyl-CoA-sodium-生命科學試劑-MCE
- 體檢中心接待規(guī)范流程
- 夏季食堂食品安全注意事項
- 知識產(chǎn)權合規(guī)管理體系解讀
- JJF(陜) 035-2020 雨滴譜式降水現(xiàn)象儀現(xiàn)場校準規(guī)范
- 科研倫理與學術規(guī)范(研究生)期末試題
- 2024年網(wǎng)格員考試題庫完美版
- 出入境交通運輸工具檢查課件
- 2024年廣東省安全員C證(專職安全生產(chǎn)管理人員)考試試題題庫
- 防雨雪冰凍應急演練
- GB/T 44536-2024CVD陶瓷涂層熱膨脹系數(shù)和殘余應力試驗方法
- 大疆在線測評題
評論
0/150
提交評論