




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、操作系統(tǒng)課程設(shè)計實驗報告實驗六 簡單shell班級: 07111301 學(xué)號: 1120131743 姓名: 談?wù)啄?學(xué)號: 1120131767 姓名: 徐欣廷 學(xué)號: 1120131746 姓名: 楊知水 學(xué)號: 1120131766 姓名: 杜田野 一、實驗?zāi)康耐ㄟ^實現(xiàn)一個簡單的shell命令解釋器,加深對Windows系統(tǒng)調(diào)用的理解,同時了解管道命令的設(shè)計實現(xiàn)機制。二、實驗內(nèi)容在Windows平臺上實現(xiàn)Linux的某些命令: 展開指定目錄:myls dir 文件查看和連接:mycat -n file1 file2 顯示文檔的開頭:myhead number filename 排序:my
2、sort file1 file2 統(tǒng)計可執(zhí)行文件執(zhí)行時間:mytime program1.exe 復(fù)制文件:mycp a b 自定義出錯提示命令:mysl分別對應(yīng)于Linux系統(tǒng)中的ls cat head sort time cp sl命令,在具體設(shè)計實現(xiàn)的時候用法做了簡化。其中,mycat、myhead和mysort為三條管道命令,例如:mysort file1.txt file2.txt | myhead 6 | mycat -n三、程序設(shè)計與實現(xiàn)1、程序中使用的結(jié)構(gòu)體(1) 處理輸入命令字符串的自定義結(jié)構(gòu)體CMD,定義如下struct CMD int cmdposi10;/記錄每條管道命
3、令在命令字符串中是第幾個字符串int lastcmdposi; /最后一條命令是第幾條命令int subcmdparameter10;/每條管道命令所帶的參數(shù)個數(shù)char* subcmd1010;/記錄命令行中的每一個字符串cmd;對于輸入命令:mysort file1.txt file2.txt | myhead 6 | mycat n字符串的位置: 0 1 2 3 4 5 6 7 8cmdposi: cmdposi0=0 cmdposi1=4 cmdposi2=7subcmd0: mysort file1.txt file2.txtsubcmdsubcmd1: myhead 6subcmd
4、2: mycat n(2) 創(chuàng)建進程時,PROCESS_INFORMATION結(jié)構(gòu)返回有關(guān)新進程及其主線程的信息。其結(jié)構(gòu)定義如下:typedef struct _PROCESS_INFORMATION HANDLE hProcess;/新創(chuàng)建進程的句柄 HANDLE hThread;/新創(chuàng)建進程的主線程的句柄 DWORD dwProcessId;/新創(chuàng)建進程的標識 DWORD dwThreadId;/新創(chuàng)建進程的主線程的標識 PROCESS_INFORMATION, *LPPROCESS_INFORMATION;(3) 獲取系統(tǒng)時間時,使用到SYSTEMTIME結(jié)構(gòu)體,其定義如下:typede
5、f struct _SYSTEMTIME WORD wYear;/年WORD wMonth;/月WORD wDayOfWeek;/星期WORD wDay;/天WORD wHour;/小時WORD wMinute;/分鐘WORD wSecond;/秒WORD wMilliseconds;/毫秒 SYSTEMTIME, *PSYSTEMTIME;(4) 在調(diào)用函數(shù)FindFirstFile、FindNextFile時,將找到的文件的信息存儲在win32_FIND_DATA結(jié)構(gòu)體中。typedef struct _WIN32_FIND_DATA DWORD dwFileAttributes;/文件屬
6、性 FILETIME ftCreationTime;/文件創(chuàng)建時間 FILETIME ftLastAccessTime;/文件最后一次訪問時間 FILETIME ftLastWriteTime;/文件最后一次修改時間 DWORD nFileSizeHigh;/文件長度高32位 DWORD nFileSizeLow;/文件長度低32位 DWORD dwReserved0;/系統(tǒng)保留 DWORD dwReserved1;/系統(tǒng)保留 TCHAR cFileNameMAX_PATH;/長文件名 TCHAR cAlternateFileName14;/8.3格式文件名 WIN32_FIND_DATA,
7、*PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;(5) FILETIME結(jié)構(gòu)體用來記錄文件時間,該結(jié)構(gòu)是表示100納秒間隔數(shù)為64位值從1601年一月1日。typedef struct _FILETIME DWORD dwLowDateTime;/低32位 DWORD dwHighDateTime;/高32位 FILETIME, *PFILETIME, *LPFILETIME;2、使用的主要Windows API(1) CreateNamedPipe()函數(shù)作用:創(chuàng)建命名管道調(diào)用格式:HANDLE WINAPI CreateNamedPipe(LPCTSTR lpN
8、ame,/管道名稱DWORD dwOpenMode,/管道打開方式DWORD dwPipeMode,/管道數(shù)據(jù)組織方式DWORD nMaxInstances,/管道最大實例量DWORD nOutBufferSize,/輸出緩沖區(qū)長度DWORD nInBufferSize,/輸入緩沖區(qū)長度DWORD nDefaultTimeOut,/默認等待時間LPSECURITY_ATTRIBUTES lpSecurityAttributes/安全屬性);說明:調(diào)用成功返回管道的句柄,失敗返回?zé)o效句柄值。(2) ConnectNamedPipe()函數(shù)作用:管道創(chuàng)建者與客戶進行連接調(diào)用格式:BOOL WINA
9、PI ConnectNamedPipe(HANDLE hNamedPipe,/命名管道的句柄LPOVERLAPPED lpOverlapped/重疊屬性);說明:如果lpOverlapped為NULL,那么,若管道已經(jīng)連接,就返回TRUE,若發(fā)生錯誤,或者管道已經(jīng)連接,就返回0;如果lpOverlapped有效,就返回零。(3) WaitNamedPipe()函數(shù)作用:客戶等候與管道創(chuàng)建者建立連接調(diào)用格式:BOOL WINAPI WaitNamedPipe(LPCTSTR lpNamedPipeName,/將要連接的管道名稱DWORD nTimeOut/等待時間,以秒為單位);說明:當(dāng)管道創(chuàng)建
10、者已調(diào)用ConnectNamePipe()函數(shù)等待與一個客戶連接時,該函數(shù)成功返回非0,如果失敗,或者管道不存在,則返回0。(4) DisconnectNamedPipe()函數(shù)作用:管道創(chuàng)建者斷開與一個客戶連接的命名管道調(diào)用格式:BOOL WINAPI DisconnectNamedPipe(_In_ HANDLE hNamedPipe);說明:hNamedPipe為要斷開管道的句柄,非0表示成功,0表示失敗。(5)其他的一些API已經(jīng)在之前的四個實驗中詳細介紹過,故在此不做贅述。有CreateProcess()、WaitForSingleObject()、GetSystemTime()、F
11、indFirstFile()、FindNextFile()、CreateFile()、ReadFile()、WriteFile()、GetFileTime()、SetFileTime()、CreateDirectory()等。四、實驗結(jié)果及分析1、實驗結(jié)果圖一 雙管道命令如上圖一所示,首先顯示file1.txt和file2.txt的內(nèi)容,myhead命令取前3行輸出,mysort命令則是將那3行內(nèi)容排序后再輸出,接著mycat命令最后加上行標再次輸出。圖二 單管道命令如上圖二所示,首先顯示file1.txt和file2.txt的內(nèi)容,mysort命令將其排序后輸出,接著myhead命令取其前3
12、行輸出。圖三 mytime命令、myls命令如上圖三所示,mytime命令可以計算可執(zhí)行程序的執(zhí)行時間,myls命令可以展開指定目錄,并顯示文件名稱、創(chuàng)建時間、修改時間和文件大小。圖四 mycp命令如上圖四所示,mycp命令其實就是實驗五的任務(wù),在將其收錄進我們shell中。圖五 mysl命令如上圖五所示,在Linux系統(tǒng)中,ls命令是很常用的,所以程序員一旦不小心敲錯了,誤寫成sl也是情有可原的,這時Linux的terminal會顯示一輛跑動的小火車,以此提示程序員。上述mysl命令的設(shè)計也是基于此,這也使得我們的shell變得生動有趣。2、實驗分析(1)UNIX系統(tǒng)進程之間的通信方式簡介以
13、及對比管道通信:管道通信允許進程之間按照FIFO方式進行傳輸數(shù)據(jù),一些進程用write命令向管道寫入數(shù)據(jù),另一些進程用read命令從管道中讀數(shù)據(jù),且彼此之間同步執(zhí)行,管道通信是進程使用文件系統(tǒng)中文件進行的,只要通信的雙方基本同步,可認為這個文件是無限大的。無名管道是一個臨時文件,當(dāng)文件被關(guān)閉后,文件就不復(fù)存在了,它是提供給同族進程之間使用的通信辦法。有名管道則是實現(xiàn)了無家族關(guān)系進程之間的通信,任何知道管道名字的進程都可以打開使用,有名管道文件一旦被創(chuàng)建后,磁盤上有一個對應(yīng)的目錄項和索引節(jié)點,它與普通文件類似,是通過路徑名存取的,只要這種文件不顯示刪除,它就永遠存在,只是文件長度為零。信號量:信
14、號量機制的功能是比較強的,它提供了信號量集合。這種機制是通過P、V操作原語實現(xiàn)的,每次只進行單位數(shù)據(jù)的交互,通信效率比較低。消息緩沖&共享內(nèi)存:采用消息緩沖和共享內(nèi)存區(qū)是,進程之間可以進行大批數(shù)據(jù)的交互。其中,信號量、消息緩沖和共享內(nèi)存區(qū)都屬于UNIX系統(tǒng)V的交互進程通信使用的資源,又成IPC資源。IPC屬雞的數(shù)據(jù)結(jié)構(gòu)在進程之間請求IPC資源(信號量、消息隊列和共享內(nèi)存區(qū))(2)Windows對于管道通信的設(shè)計機制簡介Windows最大的特點是建立一個簡單的客戶機/服務(wù)器程序設(shè)計體系,在這個體系結(jié)構(gòu)中,在客戶機與服務(wù)器之間,數(shù)據(jù)既可以單向傳遞,也可雙向流動。對命令管道服務(wù)器和客戶機來說,兩者的
15、區(qū)別在于:服務(wù)器是唯一一個有權(quán)創(chuàng)建命名管道的進程,也只有它才能接受管道客戶機的連接請求。對一個客戶機應(yīng)用來說,它只能同一個現(xiàn)成的命名管道服務(wù)器建立連接。在客戶機應(yīng)用和服務(wù)器應(yīng)用之間,一旦建立好連接,兩個進程都能使用標準的Win32函數(shù),在管道上進行數(shù)據(jù)的讀取與寫入。(3)客戶與服務(wù)器(管道創(chuàng)建者)之間使用管道通信的步驟:a.建立連接,服務(wù)端通過函數(shù)CreateNamedPipe()創(chuàng)建一個命名管道的示例并返回用于今后操作的句柄。客戶端通過調(diào)用WaitNamedPipe()使服務(wù)進程等待來自客戶的示例連接,如果在超時值變?yōu)?之前,有一個管道可以為連接使用,則WaitNamePipe()將返回TR
16、UE,并通過CreateFile()來呼叫服務(wù)端的連接。此時服務(wù)端將接受客戶端的連接請求,成功建立連接,服務(wù)端ConnectNamedPipe()返回TRUE,客戶端CreateFile()將返回一指向管道文件的句柄。b.通信實現(xiàn),連接建立之后,客戶端與服務(wù)器使用得到的管道文件句柄通過調(diào)用WriteFile()和ReadFile(),彼此之間進行信息交換。c.連接終止,當(dāng)客戶端與服務(wù)端的通信結(jié)束,客戶端調(diào)用CloseHandle()斷開連接;而服務(wù)端接著調(diào)用DisconnectNamedPipe()。(4)實驗設(shè)計簡介對于管道命令,本shell中只有myhead、mycat、mysort這三個
17、管道命令。相互協(xié)作可以實現(xiàn)管道(當(dāng)然,這三個命令也可以單獨使用),就拿myhead來說,它的調(diào)用形式只有如下四種形式:* | myhead 3 | * myhead 3 file1.txt* | myhead 3myhead 3 file1.txt | *對于此,設(shè)置兩個標記 LeftMycatPipeFlag、LeftMysortPipeFlag 用來記錄myhead命令前面是否出現(xiàn)了管道,同時設(shè)置標記 islastcmd 來記錄 myhead 是否為最后一條子命令。這樣就可以通過這三個標志來分情況處理。具體設(shè)計實現(xiàn)見代碼:對于命令“mysort file1.txt | myhead 6 |
18、 mycat n”來說:LeftMycatPipeFlag = find_left_mycat_pipe();LeftMysortPipeFlag = find_left_mysort_pipe();int existence = LeftMycatPipeFlag | LeftMysortPipeFlag;/Judge the existence of left pipeif(existence=1 & islastcmd=0) /eg: mycat -n file1.txt | myhead 3 | mysort /get data from pipeif(LeftMycatPipeFla
19、g = 1)get_left_mycat_pipe();else if(LeftMysortPipeFlag = 1)get_left_mysort_pipe();/create pipe, place datacreate_myhead_pipe();else if(existence=0 & islastcmd=1) /eg: myhead 3 file1.txt/process data ,then printprocess_file_print();else if(existence=1 & islastcmd=1) /eg: mycat -n file1.txt | myhead 3
20、/get data from pipe,then printif(LeftMycatPipeFlag = 1)get_left_mycat_pipe();else if(LeftMysortPipeFlag = 1)get_left_mysort_pipe();else if(existence=0 & islastcmd=0) /eg: myhead 3 file1.txt | mycat -n /process data ,put into bufferprocess_file_into_buffer();/create pipe, place datacreate_myhead_pipe
21、();管道通信原理圖如下所示: (5)shell各部分說明- shell 主控程序 400行 - 對輸入的命令進行處理,為各個命令創(chuàng)建進程,運行結(jié)束時終止進程- myls 展開指定目錄 200行 -使用格式:myls dir參數(shù)說明:若dir不為“.”,則展開dir,否則展開當(dāng)前目錄,顯示文件創(chuàng)建時間、最后修改時間、大小等基本屬性- mycat 文本文件查看和連接 400行 -使用格式:mycat -n file1 file2 參數(shù)說明:由1開始對所有輸出的行數(shù)編號: -n- myhead 顯示文檔的開頭 300行 -使用格式:myhead number filename參數(shù)說明:number
22、為要顯示的行數(shù)- mysort 排序 300行 -使用格式:mysort file1 file2 參數(shù)說明:命令用于將所有文件內(nèi)容按第一列來排序(若第一列相同,則看第二列)- mycp 復(fù)制文件 150行 -使用格式:mycp sour_dir des_dir參數(shù)說明:sour_dir為源目錄,des_dir為新創(chuàng)建的目錄。- mytime 統(tǒng)計可執(zhí)行文件執(zhí)行時間 100行 -使用格式:mytime program1.exe參數(shù)說明:參數(shù)為一個可執(zhí)行文件- mysl 錯誤提示 400行 -使用格式:mysl說明:在Linux系統(tǒng)中,ls命令是很常用的,經(jīng)常會誤寫成sl,這時shell會顯示一輛
23、跑動的小火車,以此提示程序員。命令舉例:(1)mycat -n file1 | myhead 3 將文件 file1 的內(nèi)容加上行號后顯示前3行(2)myhead 3 file1 | mycat -n 將文件 file1 的內(nèi)容顯示前3行后加上行號(注:上述兩條命令的操作最終結(jié)果等價)(3)mysort file1 file2 | mycat -n | myhead 5 將 file1 和 file2 的內(nèi)容合并排序、加上行號、顯示前5行(4)mycat -n file1.txt 把file1.txt的內(nèi)容加行標后輸出(5)myhead 2 file2.txt 輸出file2.txt的前2行
24、(6)mysort file1.txt 把file1.txt的內(nèi)容排序后輸出(7)mytime program1.exe 顯示program1.exe的執(zhí)行時間(8)mycp a b 將文件夾a的內(nèi)容復(fù)制到文件夾b(9)myls . 展開當(dāng)前目錄(10)myls a 展開指定目錄a(11)mysl 顯示跑動的小火車五、實驗收獲與體會實驗代碼量達到了2300行,實現(xiàn)了簡單shell,基本達到了要求。不過由于時間關(guān)系實驗中還有很多缺陷和不足有待改進。談?wù)啄甑男牡皿w會:本次試驗中,我負責(zé)shell整體框架的設(shè)計以及myhead、mysort、mycat三條管道命令的實現(xiàn)。在實驗中,學(xué)習(xí)了很多關(guān)于UN
25、IX和Windows的管道設(shè)計機制相關(guān)知識。實驗中最大的挑戰(zhàn)莫過于對于管道命令的各個字符串的處理,為此我特地設(shè)計了CMD結(jié)構(gòu)體來分割管道命令,還有實驗中需要處理諸多函數(shù),函數(shù)相互調(diào)用的時候,接口設(shè)計十分重要。光是某些單個命令的設(shè)計實現(xiàn)就需要400行的代碼量,可想而知,若是接口設(shè)計的不好,勢必會給后續(xù)工作帶來影響。尤其是對于命令所帶的參數(shù)的處理尤其麻煩,還有為每個命令創(chuàng)建進程的時候,szCmdline所帶的參數(shù)也是需要小心處理。本次實驗無疑極大地提升了我的項目動手能力,一個星期持續(xù)不斷的編程還是非常刺激的,這其中遇到的問題勝不勝數(shù),比如說,服務(wù)器端創(chuàng)建pipe時,buffer緩沖區(qū)不能為空:若為空,則在創(chuàng)建pipe時調(diào)用的Writ
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 抽紗刺繡風(fēng)格演變考核試卷
- 外貿(mào)英語函電中的payment
- 2023-2024學(xué)年北京市房山區(qū)高一下學(xué)期期中考試語文試題(解析版)
- 探索地球奧秘
- 山西財經(jīng)大學(xué)華商學(xué)院《數(shù)據(jù)庫系統(tǒng)原理與應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川大學(xué)《微生物學(xué)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東力明科技職業(yè)學(xué)院《游泳》2023-2024學(xué)年第二學(xué)期期末試卷
- 陜西省西安市鄠邑區(qū)重點達標名校2024-2025學(xué)年初三期中考試英語試題試卷英語試題含答案
- 南寧市良慶區(qū)2024-2025學(xué)年數(shù)學(xué)三下期末經(jīng)典模擬試題含解析
- 無錫工藝職業(yè)技術(shù)學(xué)院《建筑實務(wù)應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025屆東北三省四市高三第二次聯(lián)考英語試卷含答案
- 2025-2030中國振動監(jiān)測系統(tǒng)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 合肥高新美城物業(yè)有限公司招聘筆試題庫2025
- 《詞匯構(gòu)建法:課件中的詞根詞綴解析》
- 華為系統(tǒng)面試題及答案
- 2025年山東省濟南市歷城區(qū)中考一模物理試題(原卷版+解析版)
- Unit 7 第1課時 Welcome to the unit【基礎(chǔ)深耕】七年級英語下冊高效課堂(譯林版2024)
- 2025年第33批 歐盟REACH SVHC高度關(guān)注物質(zhì)清單247項
- 2024年江蘇省南京市中考物理試卷真題(含答案)
- K30自動生成及計算試驗記錄
- 2024-2025春魯教版(五四學(xué)制)(2024)化學(xué)初中八年級全一冊第七單元 燃燒及其控制《第二節(jié)促進燃燒與防止爆炸》教學(xué)設(shè)計
評論
0/150
提交評論