哈工程第三講進程的創(chuàng)建_第1頁
哈工程第三講進程的創(chuàng)建_第2頁
哈工程第三講進程的創(chuàng)建_第3頁
哈工程第三講進程的創(chuàng)建_第4頁
哈工程第三講進程的創(chuàng)建_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

操作系統(tǒng)實驗報告課程名稱操作系統(tǒng)實驗課程編號0920311實驗工程名稱進程的創(chuàng)立學(xué)號2023061419年級20230614姓名史勇專業(yè)計算機科學(xué)與技術(shù)學(xué)生所在學(xué)院計算機學(xué)院指導(dǎo)教師初妍實驗室名稱地點21B376實驗室哈爾濱工程大學(xué)計算機科學(xué)與技術(shù)學(xué)院第三講進程的創(chuàng)立一、實驗概述1.實驗名稱進程的創(chuàng)立2.實驗?zāi)康木毩?xí)使用EOSAPI函數(shù)CreateProcess創(chuàng)立一個進程,掌握創(chuàng)立進程的方法,理解進程和程序的區(qū)別。調(diào)試跟蹤CreateProcess函數(shù)的執(zhí)行過程,了解進程的創(chuàng)立過程,理解進程是資源分配的單位。3.實驗類型驗證型實驗4.實驗內(nèi)容準(zhǔn)備實驗練習(xí)使用控制臺命令創(chuàng)立EOS應(yīng)用程序的進程練習(xí)通過編程的方式讓應(yīng)用程序創(chuàng)立另一個應(yīng)用程序的進程調(diào)試CreateProcess函數(shù)調(diào)試PsCreateProcess函數(shù)練習(xí)通過編程的方式創(chuàng)立應(yīng)用程序的多個進程二、實驗環(huán)境WindowsXP系統(tǒng)、EOS實驗系統(tǒng)、C語言三、實驗過程1.設(shè)計思路和流程圖練習(xí)使用控制臺命令創(chuàng)立EOS應(yīng)用程序進程的具體步驟如下:1.在EOS應(yīng)用程序工程的“工程管理器〞窗口中雙擊Floppy.img文件,使用FloppyImageEditor工具翻開此軟盤鏡像文件。2.將本實驗文件夾中的Hello.exe文件拖動到FloppyImageEditor工具窗口的文件列表中釋放,Hello.exe文件即被添加到軟盤鏡像文件中。Hello.exe一個EOS應(yīng)用程序,其源代碼可以參見本實驗文件夾中的Hello.c源文件。3.在FloppyImageEditor中選擇“文件〞菜單中的“保存〞后關(guān)閉FloppyImageEditor。4.按F7生成EOS應(yīng)用工程。5.按F5啟動調(diào)試。OSLab會彈出一個調(diào)試異常對話框,并中斷應(yīng)用程序的執(zhí)行。6.在調(diào)試異常對話框中選擇“否〞,忽略異常繼續(xù)執(zhí)行應(yīng)用程序。7.激活虛擬機窗口,待該應(yīng)用程序執(zhí)行完畢后,在EOS的控制臺中輸入命令“〞后回車。8.Hello.exe應(yīng)用程序開始執(zhí)行,觀察其輸出如圖11-1。9.待Hello.exe執(zhí)行完畢后可以重復(fù)第7步,或者結(jié)束此次調(diào)試。按照下面的步驟查看應(yīng)用程序創(chuàng)立另一個應(yīng)用程序的進程的執(zhí)行結(jié)果:1.使用NewProc.c文件中的源代碼替換之前創(chuàng)立的EOS應(yīng)用程序工程中的EOSApp.c文件內(nèi)的源代碼。2.按F7生成修改后的EOS應(yīng)用程序工程。3.按F5啟動調(diào)試。OSLab會首先彈出一個調(diào)試異常對話框。4.在調(diào)試異常對話框中選擇“否〞,繼續(xù)執(zhí)行。5.激活虛擬機窗口查看應(yīng)用程序輸出的內(nèi)容,如圖11-2。結(jié)合圖11-1,可以看到父進程〔EOSApp.exe〕首先開始執(zhí)行并輸出內(nèi)容,父進程創(chuàng)立了子進程〔Hello.exe〕后,子進程開始執(zhí)行并輸出內(nèi)容,待子進程結(jié)束后父進程再繼續(xù)執(zhí)行。6.結(jié)束此次調(diào)試。按照下面的步驟調(diào)試CreateProcess函數(shù)創(chuàng)立進程的過程:1.按F5啟動調(diào)試EOS應(yīng)用程序,OSLab會首先彈出一個調(diào)試異常對話框。2.選擇“是〞調(diào)試異常,調(diào)試會中斷。3.在main函數(shù)中調(diào)用CreateProcess函數(shù)的代碼行〔第57行〕添加一個斷點。4.按F5繼續(xù)調(diào)試,在斷點處中斷。5.按F11調(diào)試進入CreateProcess函數(shù)。此時已經(jīng)開始進入EOS內(nèi)核進行調(diào)試。調(diào)試PspCreateProcessEnvironment函數(shù)的步驟如下:1.在PsCreateProcess函數(shù)中找到調(diào)用PspCreateProcessEnvironment函數(shù)的代碼行〔create.c文件的第163行〕,并在此行添加一個斷點。2.按F5繼續(xù)調(diào)試,到此斷點處中斷。3.按F11調(diào)試進入PspCreateProcessEnvironment函數(shù)。接下來調(diào)試初始化進程控制塊中各個成員變量的過程:1.首先創(chuàng)立進程的地址空間,即4G虛擬地址空間。在代碼行〔create.c文件的第437行〕NewProcess->Pas=MmCreateProcessAddressSpace();添加一個斷點。2.按F5繼續(xù)調(diào)試,到此斷點處中斷。3.按F10執(zhí)行此行代碼后中斷。4.在“監(jiān)視〞窗口中查看進程控制塊的成員變量Pas的值已經(jīng)不再是0。說明已經(jīng)初始化了進程的4G虛擬地址空間。5.使用F10一步步調(diào)試PspCreateProcessEnvironment函數(shù)中后面的代碼,在調(diào)試的過程中根據(jù)執(zhí)行的源代碼,查看“監(jiān)視〞窗口中*NewProcess表達式的值,觀察進程控制塊中哪些成員變量是被哪些代碼初始化的,哪些成員變量還沒有被初始化。6.當(dāng)從PspCreateProcessEnvironment函數(shù)返回到PsCreateProcess函數(shù)后,停止按F10。此時“監(jiān)視〞窗口中已經(jīng)不能再顯示表達式*NewProcess的值了,在PsCreateProcess函數(shù)中是使用ProcessObject指針指向進程控制塊的,所以將表達式*ProcessObject添加到“監(jiān)視〞窗口中就可以繼續(xù)觀察新建進程控制塊中的信息。7.接下來繼續(xù)使用F10一步步調(diào)試PsCreateProcess函數(shù)中的代碼,同樣要注意觀察執(zhí)行后的代碼修改了進程控制塊中的哪些成員變量。當(dāng)調(diào)試到PsCreateProcess函數(shù)的最后一行代碼時,查看進程控制塊中的信息,此時所有的成員變量都已經(jīng)被初始化了〔注意觀察成員ImageName的值〕。8.按F5繼續(xù)執(zhí)行,EOS內(nèi)核會為剛剛初始化完畢的進程控制塊新建一個進程。激活虛擬機窗口查看新建進程執(zhí)行的結(jié)果。9.在OSLab中選擇“調(diào)試〞菜單中的“停止調(diào)試〞結(jié)束此次調(diào)試。10.選擇“調(diào)試〞菜單中的“刪除所有斷點〞。2.算法實現(xiàn)4.主要數(shù)據(jù)結(jié)構(gòu)、實現(xiàn)代碼及其說明5.源程序并附上注釋#include"EOSApp.h"http://main函數(shù)參數(shù)的意義://argc-argv數(shù)組的長度,大小至少為1,argc-1為命令行參數(shù)的數(shù)量。//argv-字符串指針數(shù)組,數(shù)組長度為命令行參數(shù)個數(shù)+1。其中argv[0]固定指向當(dāng)前//進程所執(zhí)行的可執(zhí)行文件的路徑字符串,argv[1]及其后面的指針指向各個命令行//參數(shù)。//例如通過命令行內(nèi)容"a:\hello.exe-a-b"啟動進程后,hello.exe的main函//數(shù)的參數(shù)argc的值為3,argv[0]指向字符串"a:\hello.exe",argv[1]指向//參數(shù)字符串"-a",argv[2]指向參數(shù)字符串"-b"。//intmain(intargc,char*argv[]){ // //啟動調(diào)試EOS應(yīng)用程序前要特別注意下面的問題: // //1、如果要在調(diào)試應(yīng)用程序時能夠調(diào)試進入內(nèi)核并顯示對應(yīng)的源碼, //必須使用EOS核心工程編譯生成完全版本的SDK文件夾,然 //后使用此文件夾覆蓋應(yīng)用程序工程中的SDK文件夾,并且EOS //核心工程在磁盤上的位置不能改變。 //2、在啟動調(diào)試應(yīng)用程序之前必須首先刪除/禁用所有的斷點,在斷 //點中斷(int3)被命中后才能重新添加/啟用斷點,否那么啟動 //調(diào)試會失敗。STARTUPINFOStartupInfo; PROCESS_INFORMATIONProcInfo[10]; inta[10],i,j; ULONGulExitCode; //子進程退出碼 INTnResult=0; //main函數(shù)返回值。0表示成功,非0表示失敗。#ifdef_DEBUG __asm("int$3\nnop");#endifprintf("Createtenprocessesandwaitfortheprocessesexit...\n\n");//使子進程和父進程使用相同的標(biāo)準(zhǔn)句柄。 StartupInfo.StdInput=GetStdHandle(STD_INPUT_HANDLE); StartupInfo.StdOutput=GetStdHandle(STD_OUTPUT_HANDLE); StartupInfo.StdError=GetStdHandle(STD_ERROR_HANDLE); //為一個應(yīng)用程序同時創(chuàng)立10個子進程。 for(i=0;i<10;i++) { if(CreateProcess("A:\\Hello.exe",NULL,0,&StartupInfo,&ProcInfo[i])) a[i]=1; elsea[i]=0; }for(j=0;j<10;j++) { if(a[j]){ //創(chuàng)立子進程成功,等待子進程運行結(jié)束。 // WaitForSingleObject(ProcInfo[j].ProcessHandle,INFINITE); //得到并輸出子進程的退出碼 GetExitCodeProcess(ProcInfo[j].ProcessHandle,&ulExitCode); } else{printf("CreateProcessFailed,Errorcode:0x%X.\n",GetLastError()); nResult=1;} for(j=0;j<10;j++) {printf("\nTheprocess%dexitwith%d.\n",j,ulExitCode); CloseHandle(ProcInfo[j].ProcessHandle); CloseHandle(ProcInfo[j].ThreadHandle);} }returnnResult;}6.程序運行時的初值和運行結(jié)果四、實驗體會本次實驗較為簡單,屬于驗證型實驗。實驗過程中,在調(diào)試時添加監(jiān)視對象時,因為少了*導(dǎo)致結(jié)果不正確,后請教同學(xué)后解決了,另外在動手實現(xiàn)10個進程創(chuàng)立的問題時,一開始沒有頭緒,后來和原創(chuàng)立2個進程的程序比照以及for循環(huán)提示,寫出了程序,并和同學(xué)討論后,修正了對進程創(chuàng)立失敗時的操作。用PROCESS_INFORMATION類型定義一個有10個元素的數(shù)組,每一個元素對應(yīng)一個進程。使用一個循環(huán)創(chuàng)立10個子進程,然后再使用一個循環(huán)等待10個子進程結(jié)束,得到退出碼后關(guān)閉句柄。對于不能創(chuàng)立成功的進程那么直接結(jié)束這個進程并且彈出錯誤信息,之后轉(zhuǎn)到下一個進程,使進程之間不互相影響。通過這次實驗,我對進程的相關(guān)知識增加了理解。有了動手實踐的時機讓我對于課本上進程的相關(guān)知識有了新的認(rèn)識和更深的記憶。學(xué)習(xí)了如何創(chuàng)立進程和關(guān)閉句柄等,豐富了編程的相關(guān)知識。附:1.在PsCreateProcess函數(shù)中調(diào)用了PspCreateProcessEnvironment函數(shù)后又先后調(diào)用了PspLoadProcessImage和PspCreateThread函數(shù),學(xué)習(xí)這些函數(shù)的主要功能。能夠交換這些函數(shù)調(diào)用的順序嗎?思考其中的原因。答:PspCreate

溫馨提示

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

最新文檔

評論

0/150

提交評論