操作系統(tǒng)實(shí)驗(yàn)綜述_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)綜述_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)綜述_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)綜述_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)綜述_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、西安財(cái)經(jīng)學(xué)院 信息學(xué)院操作系統(tǒng)實(shí)驗(yàn)報(bào)告班級(jí)計(jì)算機(jī)類1506年級(jí)2015級(jí)姓名_趙孟洋學(xué)號(hào) 1505990621指導(dǎo)教師王瑞實(shí)驗(yàn)名稱進(jìn)程描述、創(chuàng)建與撤消 實(shí)驗(yàn)室 實(shí)驗(yàn)樓422實(shí)驗(yàn)日期2017-5-3一. 實(shí)驗(yàn)?zāi)康?. 通過(guò)對(duì) Windows編程,進(jìn)一步熟悉操作系統(tǒng)的基本概念,較好地理解 Windows的結(jié)構(gòu)。2. 通過(guò)創(chuàng)建進(jìn)程、觀察正在運(yùn)行的進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)和調(diào)試操作,進(jìn)一步熟悉操作系統(tǒng)的進(jìn)程概念,理解Windows進(jìn)程生存過(guò)程。3. 通過(guò)閱讀和分析實(shí)驗(yàn)程序,學(xué)習(xí)創(chuàng)建進(jìn)程、觀察進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)方法。二. 實(shí)驗(yàn)環(huán)境需要準(zhǔn)備一臺(tái)運(yùn)行 Windows操作系統(tǒng)的計(jì)算機(jī),且該計(jì)算機(jī)中需安裝

2、Visual C+ 6.0專業(yè)版或企業(yè)版。三. 背景知識(shí)1. Windows編程初步Windows可以識(shí)別的應(yīng)用程序包括控制臺(tái)應(yīng)用程序、GUI應(yīng)用程序和服務(wù)應(yīng)用程序。控制臺(tái)應(yīng)用程序可以創(chuàng)建GUI , GUI應(yīng)用程序可以作為服務(wù)來(lái)運(yùn)行,服務(wù)也可以向標(biāo)準(zhǔn)的輸出流寫入數(shù)據(jù)。不同類型應(yīng)用程序間的惟一重要區(qū)別是其啟動(dòng)方法。Windows是以NT的技術(shù)構(gòu)建的,它提供了創(chuàng)建控制臺(tái)應(yīng)用程序的能力,使用戶可以利用標(biāo)準(zhǔn)的C+工具,如iostream庫(kù)中的cout和cin對(duì)象,來(lái)創(chuàng)建小型應(yīng)用程序。 當(dāng)系統(tǒng)運(yùn)行 時(shí),Windows的服務(wù)通常要向系統(tǒng)用戶提供所需功能。服務(wù)應(yīng)用程序類型需要 ServiceMail()函數(shù)

3、,由服務(wù)控制管理器(SCM)加以調(diào)用。SCM是操作系統(tǒng)的集成部分,負(fù)責(zé)響應(yīng)系統(tǒng)啟動(dòng)以開始服務(wù)、指導(dǎo)用戶控制或從另一個(gè)服務(wù)中來(lái)的請(qǐng)求。其本身負(fù)責(zé)使應(yīng)用程序的行為像一個(gè)服務(wù)。通常,服務(wù)登錄到特殊的LocalSystem賬號(hào)下,此賬號(hào)具有與開發(fā)人員創(chuàng)建的服務(wù)不同的權(quán)限。當(dāng)令C+編譯器創(chuàng)建可執(zhí)行程序時(shí),編譯器將源代碼編譯成OBJ文件,然后將其與標(biāo)準(zhǔn)庫(kù)相鏈接。產(chǎn)生的EXE文件是裝載器指令、機(jī)器指令和應(yīng)用程序的數(shù)據(jù)的集合。裝載器指令告訴系統(tǒng)從哪里裝載機(jī)器代碼。另一個(gè)裝載器指令告訴系統(tǒng)從哪里開始執(zhí)行進(jìn)程的主線 程。在進(jìn)行某些設(shè)置后,進(jìn)入開發(fā)者提供的 mai n()、ServiceMai n()或Win Ma

4、i n()函數(shù)的低級(jí)入口點(diǎn)。機(jī)器代碼中包括有控制邏輯,它所做的事包括跳轉(zhuǎn)到Windows API函數(shù),進(jìn)行計(jì)算或向磁盤寫入數(shù)據(jù)等。Windows允許開發(fā)人員將大型應(yīng)用程序分為較小的、互相有關(guān)系的服務(wù)模塊,即動(dòng)態(tài)鏈接庫(kù)(DLL)代碼塊,在其中包含應(yīng)用程序所使用的機(jī)器代碼和應(yīng)用程序的數(shù)據(jù)。1. Windows進(jìn)程的生命”Windows所創(chuàng)建的每個(gè)進(jìn)程都從調(diào)用CreateProcess() API函數(shù)開始,該函數(shù)的任務(wù)是在對(duì)象管理器子系統(tǒng)內(nèi)初始化進(jìn)程對(duì)象。每一進(jìn)程都以調(diào)用 ExitProcess()或TerminateProcess()API函數(shù)終止。通常應(yīng)用程序的框架負(fù)責(zé)調(diào)用ExitProcess

5、()函數(shù)。對(duì)于 C+運(yùn)行庫(kù)來(lái)說(shuō),這一調(diào)用發(fā)生在應(yīng)用程序的main()函數(shù)返回之后。2.1創(chuàng)建進(jìn)程CreateProcess()調(diào)用的核心參數(shù)是可執(zhí)行文件運(yùn)行時(shí)的文件名及其命令行。表3.4詳細(xì)地列出了每個(gè)參數(shù)的類型和名稱。表2.1 CreateProcess()函數(shù)的參數(shù)參數(shù)名稱使用目的LPCTSTRIpApplivationName全部或部分地指明包括可執(zhí)行代碼的EXE文件的文件名LPCTSTR lpCommandLine向可執(zhí)行文件發(fā)送的參數(shù)LPSECURIITY_A TTRIBUTES lpProcessAttributes返回進(jìn)程句柄的安全屬性。主要指明這一句柄是否應(yīng)該由其他子進(jìn)程所繼承

6、LPSECURIITY_A TTRIBUTES IpThreadAttributes返回進(jìn)程的主線程的句柄的安全屬性BOOL bInheritHandle一種標(biāo)志,告訴系統(tǒng)允許新進(jìn)程繼承創(chuàng)建者進(jìn)程的句柄DWORD dwCreationFlage特殊的創(chuàng)建標(biāo)志(女口 CREATE_SUSPENDED)的位標(biāo)記LPVOID lpEnvironment向新進(jìn)程發(fā)送的一套環(huán)境變量;如為null值則發(fā)送調(diào)用者環(huán)境LPCTSTR lpCurrentDirectory新進(jìn)程的啟動(dòng)目錄STARTUPINFO lpStartupInfoSTARTUPINFO結(jié)構(gòu),包括新進(jìn)程的輸入和輸出配置的詳情L(zhǎng)PPROCES

7、S_INFORMA TION lpProcessInformation調(diào)用的結(jié)果塊;發(fā)送新應(yīng)用程序的進(jìn)程和主線程的句柄和ID可以指定第一個(gè)參數(shù), 即應(yīng)用程序的名稱,其中包括相對(duì)于當(dāng)前進(jìn)程的當(dāng)前目錄的全路 徑或者利用搜索方法找到的路徑;IpCommandLine參數(shù)允許調(diào)用者向新應(yīng)用程序發(fā)送數(shù)據(jù);接下來(lái)的三個(gè)參數(shù)與進(jìn)程和它的主線程以及返回的指向該對(duì)象的句柄的安全性有關(guān)。然后是標(biāo)志參數(shù),用以在dwCreationFlags參數(shù)中指明系統(tǒng)應(yīng)該給予新進(jìn)程什么行為。經(jīng)常使用的標(biāo)志是 CREATE SUSPNDED,告訴主線程立刻暫停。當(dāng)準(zhǔn)備好時(shí),應(yīng)該使用 ResumeThread() API來(lái)啟動(dòng)進(jìn)程。

8、另一個(gè)常用的標(biāo)志是 CREATE_NEW_ CONSOLE,告訴新 進(jìn)程啟動(dòng)自己的控制臺(tái)窗口,而不是利用父窗口。 這一參數(shù)還允許設(shè)置進(jìn)程的優(yōu)先級(jí),用以向系統(tǒng)指明,相對(duì)于系統(tǒng)中所有其他的活動(dòng)進(jìn)程來(lái)說(shuō),給此進(jìn)程多少CPU時(shí)間。接著是CreateProcess()函數(shù)調(diào)用所需要的三個(gè)通常使用缺省值的參數(shù)。第一個(gè)參數(shù)是 lpEnvironment參數(shù),指明為新進(jìn)程提供的環(huán)境;第一個(gè)參數(shù)是lpCurrent Directory,可用于向主創(chuàng)進(jìn)程發(fā)送與缺省目錄不同的新進(jìn)程使用的特殊的當(dāng)前目錄;第三個(gè)參數(shù)是 STARTUPINFO數(shù)據(jù)結(jié)構(gòu)所必需的,用于在必要時(shí)指明新應(yīng)用程序的主窗口的外觀。CreatePro

9、cess()的最后一個(gè)參數(shù)是用于新進(jìn)程對(duì)象及其主線程的句柄和ID的返回值緩沖區(qū)。以PROCESS INFORMA TION結(jié)構(gòu)中返回的句柄調(diào)用 CloseHandle() API函數(shù)是重要 的,因?yàn)槿绻粚⑦@些句柄關(guān)閉的話,有可能危及主創(chuàng)進(jìn)程終止之前的任何未釋放的資源。2.2正在運(yùn)行的進(jìn)程如果一個(gè)進(jìn)程擁有至少一個(gè)執(zhí)行線程,則為正在系統(tǒng)中運(yùn)行的進(jìn)程。通常,這種進(jìn)程使用主線程來(lái)指示它的存在。當(dāng)主線程結(jié)束時(shí),調(diào)用ExitProcess() API函數(shù),通知系統(tǒng)終止它所擁有的所有正在運(yùn)行、準(zhǔn)備運(yùn)行或正在掛起的其他線程。當(dāng)進(jìn)程正在運(yùn)行時(shí),可以查看它的許多特性,其中少數(shù)特性也允許加以修改。首先可查看的進(jìn)程

10、特性是系統(tǒng)進(jìn)程標(biāo)識(shí)符(PID),可利用GetCurrentProcessld() API函數(shù)來(lái)查看,與 GetCurrentProcess()相似,對(duì)該函數(shù)的調(diào)用不能失敗,但返回的PID在整個(gè)系統(tǒng)中都可使用。 其他的可顯示當(dāng)前進(jìn)程信息的 API函數(shù)還有GetStartupInfo()和 GetProcessShutdownParameters(),可給出進(jìn)程存活期內(nèi)的配置詳情。通常,一個(gè)進(jìn)程需要它的運(yùn)行期環(huán)境的信息。例如API函數(shù)GetModuleFileName()和GetComma ndLi ne(),可以給出用在 CreateProcess()中的參數(shù)以啟動(dòng)應(yīng)用程序。在創(chuàng)建應(yīng)用 程序時(shí)可

11、使用的另一個(gè) API函數(shù)是IsDebuggerPresent()??衫肁PI函數(shù)GetGuiResources()來(lái)查看進(jìn)程的 GUI資源。此函數(shù)既可返回指定進(jìn)程 中的打開的GUI對(duì)象的數(shù)目,也可返回指定進(jìn)程中打開的USER對(duì)象的數(shù)目。進(jìn)程的其他性能信息可通過(guò)GetProcessIoCounters()、GetProcessPriorityBoost()、GetProcessTimes()和GetProcessWorki ngSetSize() API得至U。以上這幾個(gè) API函數(shù)都只需要具有 PROCESS_QUERY_INFORMA TION訪問(wèn)權(quán)限的指向所感興趣進(jìn)程的句柄。另一個(gè)可用于

12、進(jìn)程信息查詢的API函數(shù)是 GetProcessVersion()。此函數(shù)只需感興趣進(jìn)程的PID (進(jìn)程標(biāo)識(shí)號(hào))。本實(shí)驗(yàn)的程序清單 2-4中列出了這一 API函數(shù)與GetVersionEx()的 共同作用,可確定運(yùn)行進(jìn)程的系統(tǒng)的版本號(hào)。2.3終止進(jìn)程所有進(jìn)程都是以調(diào)用ExitProcess()或者TerminateProcess()函數(shù)結(jié)束的。但最好使用前者而不要使用后者,因?yàn)檫M(jìn)程是在完成了它的所有的關(guān)閉職責(zé)”之后以正常的終止方式來(lái)調(diào)用前者的。而外部進(jìn)程通常調(diào)用后者即突然終止進(jìn)程的進(jìn)行,由于關(guān)閉時(shí)的途徑不太正常, 有可能引起錯(cuò)誤的行為。TerminateProcess() API函數(shù)只要打開帶

13、有 PROCESS_TERMINATE訪問(wèn)權(quán)的進(jìn)程對(duì)象, 就可以終止進(jìn)程,并向系統(tǒng)返回指定的代碼。這是一種 野蠻”的終止進(jìn)程的方式,但是有時(shí)卻是需要的。如果開發(fā)人員確實(shí)有機(jī)會(huì)來(lái)設(shè)計(jì)謀殺”終止別的進(jìn)程的進(jìn)程)和受害”進(jìn)程(被終止的進(jìn)程)時(shí),應(yīng)該創(chuàng)建一個(gè)進(jìn)程間通訊的內(nèi)核對(duì)象一一如一個(gè)互斥程序 一一這樣一來(lái), 受害”進(jìn)程只在等待或周期性地測(cè)試它是否應(yīng)該終止。四. 實(shí)驗(yàn)內(nèi)容1. 簡(jiǎn)單的控制臺(tái)應(yīng)用程序創(chuàng)建一個(gè)名為“ Hello ”的應(yīng)用程序。步驟1 :登錄進(jìn)入Windows 。步驟2:在“開始” “所有程序” “附件”菜單中單擊“記事本”命令,將清單 3-1 中的程序鍵入記事本中,并把代碼保存為Hell

14、o.cpp。清單2-1 一個(gè)簡(jiǎn)單的Windows XP控制臺(tái)應(yīng)用程序/ hello 項(xiàng)目# in clude void mai n()std:cout “ Hello, Windows ” “所有程序” “附件”菜單中單擊“命令提示符”命令,進(jìn)入Windows “命令提示符窗口,并利用簡(jiǎn)單的標(biāo)準(zhǔn)命令行:C: CL Hello.cpp來(lái)創(chuàng)建可執(zhí)行的 Hello.EXE。請(qǐng)記錄:操作能否正常進(jìn)行?如果不行,則可能的原因是什么? 不能正常運(yùn)行,需要添加環(huán)境變量CL.EXE步驟4:運(yùn)行Hello.EXE程序。請(qǐng)記錄:運(yùn)行結(jié)果 (如果運(yùn)行不成功,則可能的原因是什么?)運(yùn)行結(jié)果為:2. 編寫GUI應(yīng)用程序

15、實(shí)驗(yàn)在下面的實(shí)驗(yàn)中,C+編譯器創(chuàng)建一個(gè)GUI應(yīng)用程序,代碼中包括了 Win Mai n()方法, 這是GUI類型的應(yīng)用程序的標(biāo)準(zhǔn)入口點(diǎn)。步驟1:在開始” 所有程序” 附件”菜單中單擊記事本”命令,將清單2-1中的程序鍵入記事本中,并把代碼保存為2-2.cpp。清單2-2 Windows的GUI應(yīng)用程序/ msgbox 項(xiàng)目# include / 標(biāo)準(zhǔn)的 include/告訴連接器與包括MessageBox API函數(shù)的user32庫(kù)進(jìn)行連接# pragma comment(lib,“ user32.lib ”)/這是一個(gè)可以彈出信息框然后退出的筒單的應(yīng)用程序int APIENTRY WinM

16、ai n(HINSTANCEhln sta nee.HINSTANCEhPrevI nsta nee,LPSTRlpCmdLi ne,intn CmdShow)/沒(méi)有父窗口/消息框中的文本/消息框標(biāo)題/其中只有一個(gè)OK按鈕:MessageBox( NULL,“ Hello,Windows 2000 “ Greetings ” , MB_OK);/返回0以便通知系統(tǒng)不進(jìn)入消息循環(huán) return(O);WORD來(lái)鍵入和也可以利用任何其他文本編輯器鍵入程序代碼,如果這樣,例如使用 編輯程序,則應(yīng)該注意什么問(wèn)題?注意中英文符號(hào),注意保存文件時(shí)的拓展名步驟2 :在 命令提示符”窗口運(yùn)行CL.EXE,產(chǎn)生

17、2-2.EXE文件:C: CL 2-2.cpp在清單2-2的GUI應(yīng)用程序中,首先需要 Windows.h頭文件,以便獲得傳送給 WinMain() 和MessageBox() API函數(shù)的數(shù)據(jù)類型定義。接著的pragma指令指示編譯器/連接器找到User32.LIB庫(kù)文件并將其與產(chǎn)生的EXE文件連接起來(lái)。這樣就可以運(yùn)行簡(jiǎn)單的命令行命令CL 2-1.CPP來(lái)創(chuàng)建這一應(yīng)用程序,如果沒(méi)有pragma指令,貝U MessageBox() API函數(shù)就成為未定義的了。這一指令是 Visual Studio C+編譯器特有的。接下來(lái)是WinM ai n()方法。其中有四個(gè)由實(shí)際的低級(jí)入口點(diǎn)傳遞來(lái)的參數(shù)。

18、hln sta nee參數(shù)用來(lái)裝入與代碼相連的圖標(biāo)或位圖一類的資源,無(wú)論何時(shí),都可用GetModuleHa ndle()API函數(shù)將這些資源提取出來(lái)。系統(tǒng)利用實(shí)例句柄來(lái)指明代碼和初始的數(shù)據(jù)裝在內(nèi)存的何 處。句柄的數(shù)值實(shí)際上是 EXE文件映像的基地址,通常為0x00400000。下一個(gè)參數(shù)hPrevInstanee是為向后兼容而設(shè)的,現(xiàn)在系統(tǒng)將其設(shè)為NULL。應(yīng)用程序的命令行(不包括程序的名稱)是IpCmdLine參數(shù)。另外,系統(tǒng)利用nCmdShow參數(shù)告訴應(yīng)用程序如何顯示它的主窗口 (選項(xiàng)包括最小化、最大化和正常)。最后,程序調(diào)用 MessageBox() API函數(shù)并退出。如果在進(jìn)入消息循環(huán)

19、之前就結(jié)束運(yùn)行 的話,最后必須返回 0。請(qǐng)記錄:運(yùn)行結(jié)果:I;7 廠hello, window S20003進(jìn)程對(duì)象實(shí)驗(yàn)操作系統(tǒng)將當(dāng)前運(yùn)行的應(yīng)用程序看作是進(jìn)程對(duì)象。利用系統(tǒng)提供的惟一的稱為句柄(HANDLE)的號(hào)碼,就可與進(jìn)程對(duì)象交互。這一號(hào)碼只對(duì)當(dāng)前進(jìn)程有效。本實(shí)驗(yàn)表示了一個(gè)簡(jiǎn)單的進(jìn)程句柄的應(yīng)用。在系統(tǒng)中運(yùn)行的任何進(jìn)程都可調(diào)用GetCurrentProcess() API函數(shù),此函數(shù)可返回標(biāo)識(shí)進(jìn)程本身的句柄。然后就可在Windows需要該進(jìn)程的有關(guān)情況時(shí),利用這一句柄來(lái)提供。步驟1:將清單2-3.cpp程序鍵入記事本中,并把代碼保存為2-3.cpp。清單2-3獲得和使用進(jìn)程的句柄/ proc

20、handle 項(xiàng)目# in clude # in clude /確定自己的優(yōu)先權(quán)的簡(jiǎn)單應(yīng)用程序void mai n()/從當(dāng)前進(jìn)程中提取句柄HANDLE hProcessThis=:GetCurre ntProcess();/請(qǐng)求內(nèi)核提供該進(jìn)程所屬的優(yōu)先權(quán)類DWORD dwPriority=:GetPriorityClass(hProcessThis);/發(fā)出消息,為用戶描述該類std:cout “ Current process priority:”;switch(dwPriority)case HIGH_PRIORITY_CLASS: std:cout “ High ”; break;ca

21、se NORMAL_PRIORITY_CLASS: std:cout “ Normal ”; break;case IDLE_PRIORITY_CLASS: std:cout Idle ”; break;case REALTIME_PRIORITY_CLASS: std:cout “ Realtime ”; break;default: std:cout “ ” ; break;std:cout CL 2-3.cpp請(qǐng)記錄:運(yùn)行結(jié)果:ICurre n t process ftrlority * normal步驟3:將清單2-4.cpp程序鍵入記事本中,并把代碼保存為2-4.cpp。清單2-4顯

22、示如何找出系統(tǒng)中正在運(yùn)行的所有進(jìn)程,如何利用OpenProcess() API函數(shù)來(lái)獲得每一個(gè)訪問(wèn)進(jìn)程的進(jìn)一步信息。清單2-4利用句柄查出進(jìn)程的詳細(xì)信息/ proclist 項(xiàng)目# in clude # in clude # in clude /當(dāng)在用戶模式和內(nèi)核模式下都提供所耗時(shí)間時(shí),在內(nèi)核模式下進(jìn)行所耗時(shí)間的64位計(jì)算的幫助方法DWORD GetKernelModePerce ntage(co nst FILETIME & ftKernel,const FILETIME & ftUser)/將FILETIME 結(jié)構(gòu)轉(zhuǎn)化為64位整數(shù)ULONGLONG qwKernel=(ULONGLONG)

23、 ftKernel.dwHighDateTime)32)+ ftKernel.dwLowDateTime;ULONGLONG qwUser=(ULONGLONG) ftUser.dwHighDateTime)32)+ ftUser.dwLowDateTime;/將消耗時(shí)間相加,然后計(jì)算消耗在內(nèi)核模式下的時(shí)間百分比ULONGLONG qwTotal=qwKernel+qwUser;DWORD dwPct=(DWORD)(ULONGLONG)100*qwKernel)/qwTotal); return(dwPct);/以下是將當(dāng)前運(yùn)行進(jìn)程名和消耗在內(nèi)核模式下的時(shí)間百分?jǐn)?shù)都顯示出來(lái)的應(yīng)用程序void

24、 mai n()/對(duì)當(dāng)前系統(tǒng)中運(yùn)行的進(jìn)程拍取快照”HANDLE hSn apshot=:CreateToolhelp32S napshot(TH32CS_SNAPPROCESS,/ 提取當(dāng)前進(jìn)程0);/如果是當(dāng)前進(jìn)程,就將其忽略/初始化進(jìn)程入口PROCESSENTRY32 pe;:ZeroMemory(&pe,sizeof(pe);pe.dwSize=sizeof(pe);/按所有進(jìn)程循環(huán)BOOL bMore=:Process32First(hS napshot,&pe);while(bMore) /打開用于讀取的進(jìn)程HANDLE hProcess=:Ope nProcess( PROCESS

25、_QUERY_INFORMA TION, FALSE, pe.th32ProcesslD);if (hProcess!=NULL)II指明要得到信息II不必繼承這一句柄II要打開的進(jìn)程/找出進(jìn)程的時(shí)間FILETIME ftCreatio n,ftExit,ftKernelMode,ftUserMode; :GetProcessTimes( hProcess, &ftCreatio n,&ftExit,&ftKernelMode,&ftUserMode);/所感興趣的進(jìn)程/進(jìn)程的啟動(dòng)時(shí)間(絕對(duì)的)/結(jié)束時(shí)間(如果有的話) 在內(nèi)核模式下消耗的時(shí)間 在用戶模式下消耗的時(shí)間/計(jì)算內(nèi)核模式消耗的時(shí)間百分

26、比DWORD dwPctKernel=:GetKernelModePerce ntage( ftKernelMode,II在內(nèi)核模式上消耗的時(shí)間ftUserMode);II在用戶模式下消耗的時(shí)間II向用戶顯示進(jìn)程的某些信息std:cout “ Process ID: ” pe.th32ProcessID “ ,EXE file:” pe.szExeFile“,in kernel mode:” dwPctKernel CL 2-4.cpp請(qǐng)記錄:運(yùn)行結(jié)果:jro cessID汕【DIDID2IP!D!I5!I!IID!DII!IKKK f i le;3ysten.z6-14, LKt I 724

27、. EME J ?6fi,EKE i 78ftpEXE 1 95SEKE IEME14tiH,EKi t?20,EiiE t848.EXE l06ft.EXE 1912.EXE 1932.EXE K7K . EXE f il.f);in Kprnel niodH 77636.EKF FiMMim.EUE” in Kerne 1 種。(1毗 &836 M EXi flU;sqLservr ttxnx in Kt?rnel nodt; ?if i J.e :sanservic注缶*斗 i n Kern& I mode; 5fl f il : riinctllin K&twI ru(Ip j 北5f

28、ile UEXPLaRE. EKE-?: Ln K&mel node; 23 聞也趴 K*E f lie :caninein Keruel 冏o(hù)d卄 &0iy處EXE 33J2.EXE 3040,EXE 5&8”EKE f ILe : i*undL132 _ex& .X in Kernel node: 50 3164.EXE PE 他 EXE 34S&,EXE 13S2.EXEin Kfi-mc: 1 node - 1 f 1 t tiiEsain Kerne 1 mode:f 11c : v/irBlouii 忖并0*祀 ir Krne 1 node - 72 f lie : service

29、s ex&X in Keine 1 node - 65 f i Le :ein1 nD(ta 44f ilQsvclK)st c)cir 祐 in Karns 1 node p 33t lltr ; fi-vc bun t extrX in Ktrrna 1 node t 19Fi.丄c : &poa IsvK in Kernc 1 node p &初f i Le ; ejcpLorer 目)&,;1 in Kerne 1 no de = ?5 f i 1 f;; biif nnninrROc: in Kc rnRl madt: SM f tle ; c t f min . tK K lji

30、Korna 1 &6f iLc ;?()lnanr &,;rnel node; 0 file : dftvcda.ta.exe-,?c in Kei*fte L Rode: S0f i.Le :QQPYVLzftPd.frxtt-X in Kvmo t modn* 78 f i Le Hl W1OHD - EKE z in Kh rnrl mde s S4 file : ciwrt_exez irt Kem&l mode : 0flie:l-4_exe,z In Merael node: 04. 創(chuàng)建進(jìn)程實(shí)驗(yàn)本實(shí)驗(yàn)顯示了創(chuàng)建子進(jìn)程的基本框架。該程序創(chuàng)建的子進(jìn)程依然執(zhí)行父進(jìn)程的程序代 碼,顯示它

31、的系統(tǒng)進(jìn)程ID和它在進(jìn)程列表中的位置。步驟1:登錄進(jìn)入Windows。步驟 2:在 開始菜單中單擊 程序 ” Microsoft Visual Studio 6.0 Microsoft Visual C+6.0命令,進(jìn)入 Visual C+窗口。 步驟3:編輯實(shí)驗(yàn)源程序2-5.cpp。清單2-5創(chuàng)建子進(jìn)程/ proccreate 項(xiàng)目# in clude # in clude # in clude ID值/創(chuàng)建傳遞過(guò)來(lái)的進(jìn)程的克隆過(guò)程并賦于其 void StartClone(int nCloneID)/提取用于當(dāng)前可執(zhí)行文件的文件名TCHAR szFile nameMAX_PATH;EXE文件

32、名和克隆ID:GetModuleFileName(NULL,szFile name,MAX_PATH);/格式化用于子進(jìn)程的命令行并通知其TCHAR szCmdLi neMAX_PATH;:sprintf(szCmdLine, ” s %d ,szFilename,nClonelD);/用于子進(jìn)程的 STARTUPINFO 結(jié)構(gòu) STARTUPINFO si;:ZeroMemory (rein terpret cast (&si), sizeof(si);si.cb=sizeof(si);/必須是本結(jié)構(gòu)的大小/返回的用于子進(jìn)程的進(jìn)程信息PROCESS_INFORMATION pi;/利用同樣的

33、可執(zhí)行文件和命令行創(chuàng)建進(jìn)程,并賦于其子進(jìn)程的性質(zhì)BOOL bCreateOK=:CreateProcess( szFile name, szCmdLi ne, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);/對(duì)子進(jìn)程釋放引用 if (bCreateOK):CloseHa ndle(pi.hProcess); :CloseHa ndle(pi.hThread);int main (i nt argc,char* argv)/確定進(jìn)程在列表中的位置int nClo ne(0); if (argc1)/從第二個(gè)參數(shù)中提取克隆

34、 :sscanf(argv1,“ d/產(chǎn)生這個(gè)EXE的應(yīng)用程序的名稱/告訴其行為像一個(gè)子進(jìn)程的標(biāo)志/缺省的進(jìn)程安全性/缺省的線程安全性/不繼承句柄/使用新的控制臺(tái)/新的環(huán)境/當(dāng)前目錄/啟動(dòng)信息/返回的進(jìn)程信息ID,&n Clo ne);/顯示進(jìn)程位置std:cout “ Process ID:“ :GetCurrentProcessld() “,Clone ID:“ nClonestd:endl;/檢查是否有創(chuàng)建子進(jìn)程的需要const int c_nClon eMax=25;if (n Clo nec_ nClo neMax) -/發(fā)送新進(jìn)程的命令行和克隆號(hào)StartClo ne(+nClo

35、ne);/在終止之前暫停一下,輸入一個(gè)字符后,程序結(jié)束,以便觀察std:cout ” in put a char:”;getchar();std:cout5. 正在運(yùn)行的進(jìn)程實(shí)驗(yàn)本實(shí)驗(yàn)的程序中列出了用于進(jìn)程信息查詢的 API函數(shù) GetProcessVersion()與 GetVersionEx()的共同作用,可確定運(yùn)行進(jìn)程的操作系統(tǒng)的版本號(hào)。步驟1:用Visual C+編輯實(shí)驗(yàn)源程序 2-6.cpp。清單2-6使用進(jìn)程和操作系統(tǒng)的版本信息/ version 項(xiàng)目# in clude # in clude /禾U用進(jìn)程和操作系統(tǒng)的版本信息的簡(jiǎn)單示例void mai n()/提取這個(gè)進(jìn)程的ID號(hào)

36、DWORD dwldThis=:GetCurre ntProcessld();/獲得這一進(jìn)程和報(bào)告所需的版本,也可以發(fā)送0以便指明這一進(jìn)程DWORD dwVerReq=:GetProcessVersio n(dwldThis);WORD wMajorReq=(WORD)(dwVerReq16);WORD wMi norReq=(WORD)(dwV erReq & 0xfff);std:coutProcess ID:dwIdThis,requires OS: wMajorReqwM ino rReqstd:e ndl;/設(shè)置版本信息的數(shù)據(jù)結(jié)構(gòu),以便保存操作系統(tǒng)的版本信息OSVERSIONINFO

37、EX osvix;:ZeroMemory (&osvix,sizeof(osvix);osvix.dwOSVersio nln foSize=sizeof(osvix);/提取版本信息和報(bào)告:GetVersio nEx(rei nterpret_cast(&osvix); std:coutR unning on OS:osvix.dwMajorVers ion .osvix.dwMi no rVersio n std:e ndl;/顯示進(jìn)程當(dāng)前優(yōu)先級(jí)DWORD dwProcessP=:GetPriorityClass(GetCurre ntProcess(); std:coutCurrent

38、process priority is:;switch(dwProcessP)case HIGH_PRIORITY_CLASS:std:coutHigh;break;case NORMAL_PRIORITY_CLASS: std:coutNormal;break;case IDLE_PRIORITY_CLASS:std:coutldle;break;case REALTIME_PRIORITY_CLASS:std:coutRealtime;break;default:std:cout ;break;std:cout= 5)if(dwProcessP!=HIGH_PRIORITY_CLASS)/

39、如果當(dāng)前優(yōu)先級(jí)不是high,則改變優(yōu)先級(jí):SetPriorityClass(:GetCurrentProcess(),/ 利用這一進(jìn)程HIGH_PRIORITY_CLASS);/ 改變?yōu)?high/報(bào)告給用戶dwProcessP=GetPriorityClass(GetCurre ntProcess(); std:coutThe process priority have bee n cha nged to ; switch(dwProcessP)case HIGH_PRIORITY_CLASS:std:coutHigh;break;case NORMAL_PRIORITY_CLASS:std

40、:coutNormal;break;case IDLE_PRIORITY_CLASS:std:coutIdle;break;case REALTIME_PRIORITY_CLASS:std:coutRealtime;break;default:std:cout ;break;std:cout1 h fe Fu |i I aS n aili Ej Ih &|hC | d J - 1 I 曾ii u m pi vij i ii util- kiii4u當(dāng)前 PID 信息:1020,requires OS:003) 當(dāng)前操作系統(tǒng)版本:OS:5.1系統(tǒng)提示信息: Take Man ager shoul

41、d now now in dicate thisprocess is high priority清單2-6中的程序向讀者表明了如何獲得當(dāng)前的PID和所需的進(jìn)程版本信息。 為了運(yùn)行這一程序,系統(tǒng)處理了所有的版本不兼容問(wèn)題。接著,程序演示了如何使用 GetVersionEx() API函數(shù)來(lái)提取 OSVERSIONINFOEX 結(jié)構(gòu)。 這一數(shù)據(jù)塊中包括了操作系統(tǒng)的版本信息。其中,“OS : 5.1表示當(dāng)前運(yùn)行的操作系統(tǒng)是:4) 表示W(wǎng)indows xp操作系統(tǒng)清單2-5的最后一段程序利用了操作系統(tǒng)的版本信息,以確認(rèn)運(yùn)行的是 Windows。代碼接著將當(dāng)前進(jìn)程的優(yōu)先級(jí)提高到比正常級(jí)別高。步驟5:單擊

42、Ctrl+Alt+Del鍵,進(jìn)入“Windows任務(wù)管理器”,在應(yīng)用程序”選項(xiàng)卡中右 鍵單擊“26”任務(wù),在快捷菜單中選擇轉(zhuǎn)到進(jìn)程”命令。請(qǐng)記錄:在“Windows任務(wù)管理器”的進(jìn)程”選項(xiàng)卡中,與“2”任務(wù)對(duì)應(yīng)的進(jìn)程映像名稱 是(為什么?):VCSPAWN.EXE右鍵單擊該進(jìn)程名,在快捷菜單中選擇設(shè)置優(yōu)先級(jí)”命令,可以調(diào)整該進(jìn)程的優(yōu)先級(jí)(注意,如果要在任務(wù)管理器中觀察進(jìn)程優(yōu)化級(jí)改變的情況,則最好采用鼠標(biāo)雙擊可執(zhí)行文 件方式啟動(dòng)進(jìn)程,并在程序結(jié)束前設(shè)置一個(gè)暫停點(diǎn),以便觀察)。除了改變進(jìn)程的優(yōu)先級(jí)以外,還可以對(duì)正在運(yùn)行的進(jìn)程執(zhí)行幾項(xiàng)其他的操作,只要獲得其進(jìn)程句柄即可。SetProcessAffi

43、ni tyMask() API函數(shù)允許開發(fā)人員將線程映射到處理器上; SetProcessPriorityBoost() API 可關(guān)閉前臺(tái)應(yīng)用程序優(yōu)先級(jí)的提升;而 SetProcessWorkingSet()API可調(diào)節(jié)進(jìn)程可用的非頁(yè)面RAM的容量;還有一個(gè)只對(duì)當(dāng)前進(jìn)程可用的API函數(shù),即SetProcessShutdow nParameters(),可告訴系統(tǒng)如何終止該進(jìn)程。6. 終止進(jìn)程實(shí)驗(yàn)在清單2-7列出的程序中,先創(chuàng)建一個(gè)子進(jìn)程,然后向該子進(jìn)程發(fā)出自殺彈”互斥體去終止子進(jìn)程的運(yùn)行。步驟1:用Visual C+編輯實(shí)驗(yàn)源程序 2-7.cpp。清單2-7指令其父進(jìn)程來(lái) 殺掉”自己的子進(jìn)程

44、/ procterm 項(xiàng)目# in elude # in clude # in clude static LPCTSTR g_szMutexName=w2kdg .P rocTerm.mutex.Suicide;/創(chuàng)建當(dāng)前進(jìn)程的克隆進(jìn)程的簡(jiǎn)單方法void StartClo ne()/提取當(dāng)前可執(zhí)行文件的文件名TCHAR szFile name MAX_PATH;:GetModuleFileName(NULL,szFile name,MAX_PATH);/格式化用于子進(jìn)程的命令行,指明它是一個(gè)EXE文件和子進(jìn)程TCHAR szCmdLi neMAX_PATH;:sprintf(szCmdLine

45、, %schild, szFilename);/子進(jìn)程的啟動(dòng)信息結(jié)構(gòu)STARTUPINFO si;:ZeroMemory (rein terpret_cast(&si), sizeof(si); si.cb=sizeof(si);/應(yīng)當(dāng)是此結(jié)構(gòu)的大小 /返回的用于子進(jìn)程的進(jìn)程信息PROCESS_INFORMATION pi;/用同樣的可執(zhí)行文件名和命令行創(chuàng)建進(jìn)程,并指明它是一個(gè)子進(jìn)程產(chǎn)生的應(yīng)用程序名稱(本EXE文件)告訴我們這是一個(gè)子進(jìn)程的標(biāo)志 用于進(jìn)程的缺省的安全性 用于線程的缺省安全性/不繼承句柄/創(chuàng)建新窗口,使輸出更直觀 新環(huán)境 當(dāng)前目錄 啟動(dòng)信息結(jié)構(gòu) 返回的進(jìn)程信息BOOL bCreateO

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論