




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、西安財經學院 信息學院操作系統(tǒng)實驗報告班級計算機類1506年級2015級姓名_趙孟洋學號 1505990621指導教師王瑞實驗名稱進程描述、創(chuàng)建與撤消 實驗室 實驗樓422實驗日期2017-5-3一. 實驗目的1. 通過對 Windows編程,進一步熟悉操作系統(tǒng)的基本概念,較好地理解 Windows的結構。2. 通過創(chuàng)建進程、觀察正在運行的進程和終止進程的程序設計和調試操作,進一步熟悉操作系統(tǒng)的進程概念,理解Windows進程生存過程。3. 通過閱讀和分析實驗程序,學習創(chuàng)建進程、觀察進程和終止進程的程序設計方法。二. 實驗環(huán)境需要準備一臺運行 Windows操作系統(tǒng)的計算機,且該計算機中需安裝
2、Visual C+ 6.0專業(yè)版或企業(yè)版。三. 背景知識1. Windows編程初步Windows可以識別的應用程序包括控制臺應用程序、GUI應用程序和服務應用程序。控制臺應用程序可以創(chuàng)建GUI , GUI應用程序可以作為服務來運行,服務也可以向標準的輸出流寫入數據。不同類型應用程序間的惟一重要區(qū)別是其啟動方法。Windows是以NT的技術構建的,它提供了創(chuàng)建控制臺應用程序的能力,使用戶可以利用標準的C+工具,如iostream庫中的cout和cin對象,來創(chuàng)建小型應用程序。 當系統(tǒng)運行 時,Windows的服務通常要向系統(tǒng)用戶提供所需功能。服務應用程序類型需要 ServiceMail()函數
3、,由服務控制管理器(SCM)加以調用。SCM是操作系統(tǒng)的集成部分,負責響應系統(tǒng)啟動以開始服務、指導用戶控制或從另一個服務中來的請求。其本身負責使應用程序的行為像一個服務。通常,服務登錄到特殊的LocalSystem賬號下,此賬號具有與開發(fā)人員創(chuàng)建的服務不同的權限。當令C+編譯器創(chuàng)建可執(zhí)行程序時,編譯器將源代碼編譯成OBJ文件,然后將其與標準庫相鏈接。產生的EXE文件是裝載器指令、機器指令和應用程序的數據的集合。裝載器指令告訴系統(tǒng)從哪里裝載機器代碼。另一個裝載器指令告訴系統(tǒng)從哪里開始執(zhí)行進程的主線 程。在進行某些設置后,進入開發(fā)者提供的 mai n()、ServiceMai n()或Win Ma
4、i n()函數的低級入口點。機器代碼中包括有控制邏輯,它所做的事包括跳轉到Windows API函數,進行計算或向磁盤寫入數據等。Windows允許開發(fā)人員將大型應用程序分為較小的、互相有關系的服務模塊,即動態(tài)鏈接庫(DLL)代碼塊,在其中包含應用程序所使用的機器代碼和應用程序的數據。1. Windows進程的生命”Windows所創(chuàng)建的每個進程都從調用CreateProcess() API函數開始,該函數的任務是在對象管理器子系統(tǒng)內初始化進程對象。每一進程都以調用 ExitProcess()或TerminateProcess()API函數終止。通常應用程序的框架負責調用ExitProcess
5、()函數。對于 C+運行庫來說,這一調用發(fā)生在應用程序的main()函數返回之后。2.1創(chuàng)建進程CreateProcess()調用的核心參數是可執(zhí)行文件運行時的文件名及其命令行。表3.4詳細地列出了每個參數的類型和名稱。表2.1 CreateProcess()函數的參數參數名稱使用目的LPCTSTRIpApplivationName全部或部分地指明包括可執(zhí)行代碼的EXE文件的文件名LPCTSTR lpCommandLine向可執(zhí)行文件發(fā)送的參數LPSECURIITY_A TTRIBUTES lpProcessAttributes返回進程句柄的安全屬性。主要指明這一句柄是否應該由其他子進程所繼承
6、LPSECURIITY_A TTRIBUTES IpThreadAttributes返回進程的主線程的句柄的安全屬性BOOL bInheritHandle一種標志,告訴系統(tǒng)允許新進程繼承創(chuàng)建者進程的句柄DWORD dwCreationFlage特殊的創(chuàng)建標志(女口 CREATE_SUSPENDED)的位標記LPVOID lpEnvironment向新進程發(fā)送的一套環(huán)境變量;如為null值則發(fā)送調用者環(huán)境LPCTSTR lpCurrentDirectory新進程的啟動目錄STARTUPINFO lpStartupInfoSTARTUPINFO結構,包括新進程的輸入和輸出配置的詳情LPPROCES
7、S_INFORMA TION lpProcessInformation調用的結果塊;發(fā)送新應用程序的進程和主線程的句柄和ID可以指定第一個參數, 即應用程序的名稱,其中包括相對于當前進程的當前目錄的全路 徑或者利用搜索方法找到的路徑;IpCommandLine參數允許調用者向新應用程序發(fā)送數據;接下來的三個參數與進程和它的主線程以及返回的指向該對象的句柄的安全性有關。然后是標志參數,用以在dwCreationFlags參數中指明系統(tǒng)應該給予新進程什么行為。經常使用的標志是 CREATE SUSPNDED,告訴主線程立刻暫停。當準備好時,應該使用 ResumeThread() API來啟動進程。
8、另一個常用的標志是 CREATE_NEW_ CONSOLE,告訴新 進程啟動自己的控制臺窗口,而不是利用父窗口。 這一參數還允許設置進程的優(yōu)先級,用以向系統(tǒng)指明,相對于系統(tǒng)中所有其他的活動進程來說,給此進程多少CPU時間。接著是CreateProcess()函數調用所需要的三個通常使用缺省值的參數。第一個參數是 lpEnvironment參數,指明為新進程提供的環(huán)境;第一個參數是lpCurrent Directory,可用于向主創(chuàng)進程發(fā)送與缺省目錄不同的新進程使用的特殊的當前目錄;第三個參數是 STARTUPINFO數據結構所必需的,用于在必要時指明新應用程序的主窗口的外觀。CreatePro
9、cess()的最后一個參數是用于新進程對象及其主線程的句柄和ID的返回值緩沖區(qū)。以PROCESS INFORMA TION結構中返回的句柄調用 CloseHandle() API函數是重要 的,因為如果不將這些句柄關閉的話,有可能危及主創(chuàng)進程終止之前的任何未釋放的資源。2.2正在運行的進程如果一個進程擁有至少一個執(zhí)行線程,則為正在系統(tǒng)中運行的進程。通常,這種進程使用主線程來指示它的存在。當主線程結束時,調用ExitProcess() API函數,通知系統(tǒng)終止它所擁有的所有正在運行、準備運行或正在掛起的其他線程。當進程正在運行時,可以查看它的許多特性,其中少數特性也允許加以修改。首先可查看的進程
10、特性是系統(tǒng)進程標識符(PID),可利用GetCurrentProcessld() API函數來查看,與 GetCurrentProcess()相似,對該函數的調用不能失敗,但返回的PID在整個系統(tǒng)中都可使用。 其他的可顯示當前進程信息的 API函數還有GetStartupInfo()和 GetProcessShutdownParameters(),可給出進程存活期內的配置詳情。通常,一個進程需要它的運行期環(huán)境的信息。例如API函數GetModuleFileName()和GetComma ndLi ne(),可以給出用在 CreateProcess()中的參數以啟動應用程序。在創(chuàng)建應用 程序時可
11、使用的另一個 API函數是IsDebuggerPresent()。可利用API函數GetGuiResources()來查看進程的 GUI資源。此函數既可返回指定進程 中的打開的GUI對象的數目,也可返回指定進程中打開的USER對象的數目。進程的其他性能信息可通過GetProcessIoCounters()、GetProcessPriorityBoost()、GetProcessTimes()和GetProcessWorki ngSetSize() API得至U。以上這幾個 API函數都只需要具有 PROCESS_QUERY_INFORMA TION訪問權限的指向所感興趣進程的句柄。另一個可用于
12、進程信息查詢的API函數是 GetProcessVersion()。此函數只需感興趣進程的PID (進程標識號)。本實驗的程序清單 2-4中列出了這一 API函數與GetVersionEx()的 共同作用,可確定運行進程的系統(tǒng)的版本號。2.3終止進程所有進程都是以調用ExitProcess()或者TerminateProcess()函數結束的。但最好使用前者而不要使用后者,因為進程是在完成了它的所有的關閉職責”之后以正常的終止方式來調用前者的。而外部進程通常調用后者即突然終止進程的進行,由于關閉時的途徑不太正常, 有可能引起錯誤的行為。TerminateProcess() API函數只要打開帶
13、有 PROCESS_TERMINATE訪問權的進程對象, 就可以終止進程,并向系統(tǒng)返回指定的代碼。這是一種 野蠻”的終止進程的方式,但是有時卻是需要的。如果開發(fā)人員確實有機會來設計謀殺”終止別的進程的進程)和受害”進程(被終止的進程)時,應該創(chuàng)建一個進程間通訊的內核對象一一如一個互斥程序 一一這樣一來, 受害”進程只在等待或周期性地測試它是否應該終止。四. 實驗內容1. 簡單的控制臺應用程序創(chuàng)建一個名為“ Hello ”的應用程序。步驟1 :登錄進入Windows 。步驟2:在“開始” “所有程序” “附件”菜單中單擊“記事本”命令,將清單 3-1 中的程序鍵入記事本中,并把代碼保存為Hell
14、o.cpp。清單2-1 一個簡單的Windows XP控制臺應用程序/ hello 項目# in clude void mai n()std:cout “ Hello, Windows ” “所有程序” “附件”菜單中單擊“命令提示符”命令,進入Windows “命令提示符窗口,并利用簡單的標準命令行:C: CL Hello.cpp來創(chuàng)建可執(zhí)行的 Hello.EXE。請記錄:操作能否正常進行?如果不行,則可能的原因是什么? 不能正常運行,需要添加環(huán)境變量CL.EXE步驟4:運行Hello.EXE程序。請記錄:運行結果 (如果運行不成功,則可能的原因是什么?)運行結果為:2. 編寫GUI應用程序
15、實驗在下面的實驗中,C+編譯器創(chuàng)建一個GUI應用程序,代碼中包括了 Win Mai n()方法, 這是GUI類型的應用程序的標準入口點。步驟1:在開始” 所有程序” 附件”菜單中單擊記事本”命令,將清單2-1中的程序鍵入記事本中,并把代碼保存為2-2.cpp。清單2-2 Windows的GUI應用程序/ msgbox 項目# include / 標準的 include/告訴連接器與包括MessageBox API函數的user32庫進行連接# pragma comment(lib,“ user32.lib ”)/這是一個可以彈出信息框然后退出的筒單的應用程序int APIENTRY WinM
16、ai n(HINSTANCEhln sta nee.HINSTANCEhPrevI nsta nee,LPSTRlpCmdLi ne,intn CmdShow)/沒有父窗口/消息框中的文本/消息框標題/其中只有一個OK按鈕:MessageBox( NULL,“ Hello,Windows 2000 “ Greetings ” , MB_OK);/返回0以便通知系統(tǒng)不進入消息循環(huán) return(O);WORD來鍵入和也可以利用任何其他文本編輯器鍵入程序代碼,如果這樣,例如使用 編輯程序,則應該注意什么問題?注意中英文符號,注意保存文件時的拓展名步驟2 :在 命令提示符”窗口運行CL.EXE,產生
17、2-2.EXE文件:C: CL 2-2.cpp在清單2-2的GUI應用程序中,首先需要 Windows.h頭文件,以便獲得傳送給 WinMain() 和MessageBox() API函數的數據類型定義。接著的pragma指令指示編譯器/連接器找到User32.LIB庫文件并將其與產生的EXE文件連接起來。這樣就可以運行簡單的命令行命令CL 2-1.CPP來創(chuàng)建這一應用程序,如果沒有pragma指令,貝U MessageBox() API函數就成為未定義的了。這一指令是 Visual Studio C+編譯器特有的。接下來是WinM ai n()方法。其中有四個由實際的低級入口點傳遞來的參數。
18、hln sta nee參數用來裝入與代碼相連的圖標或位圖一類的資源,無論何時,都可用GetModuleHa ndle()API函數將這些資源提取出來。系統(tǒng)利用實例句柄來指明代碼和初始的數據裝在內存的何 處。句柄的數值實際上是 EXE文件映像的基地址,通常為0x00400000。下一個參數hPrevInstanee是為向后兼容而設的,現(xiàn)在系統(tǒng)將其設為NULL。應用程序的命令行(不包括程序的名稱)是IpCmdLine參數。另外,系統(tǒng)利用nCmdShow參數告訴應用程序如何顯示它的主窗口 (選項包括最小化、最大化和正常)。最后,程序調用 MessageBox() API函數并退出。如果在進入消息循環(huán)
19、之前就結束運行 的話,最后必須返回 0。請記錄:運行結果:I;7 廠hello, window S20003進程對象實驗操作系統(tǒng)將當前運行的應用程序看作是進程對象。利用系統(tǒng)提供的惟一的稱為句柄(HANDLE)的號碼,就可與進程對象交互。這一號碼只對當前進程有效。本實驗表示了一個簡單的進程句柄的應用。在系統(tǒng)中運行的任何進程都可調用GetCurrentProcess() API函數,此函數可返回標識進程本身的句柄。然后就可在Windows需要該進程的有關情況時,利用這一句柄來提供。步驟1:將清單2-3.cpp程序鍵入記事本中,并把代碼保存為2-3.cpp。清單2-3獲得和使用進程的句柄/ proc
20、handle 項目# in clude # in clude /確定自己的優(yōu)先權的簡單應用程序void mai n()/從當前進程中提取句柄HANDLE hProcessThis=:GetCurre ntProcess();/請求內核提供該進程所屬的優(yōu)先權類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請記錄:運行結果:ICurre n t process ftrlority * normal步驟3:將清單2-4.cpp程序鍵入記事本中,并把代碼保存為2-4.cpp。清單2-4顯
22、示如何找出系統(tǒng)中正在運行的所有進程,如何利用OpenProcess() API函數來獲得每一個訪問進程的進一步信息。清單2-4利用句柄查出進程的詳細信息/ proclist 項目# in clude # in clude # in clude /當在用戶模式和內核模式下都提供所耗時間時,在內核模式下進行所耗時間的64位計算的幫助方法DWORD GetKernelModePerce ntage(co nst FILETIME & ftKernel,const FILETIME & ftUser)/將FILETIME 結構轉化為64位整數ULONGLONG qwKernel=(ULONGLONG)
23、 ftKernel.dwHighDateTime)32)+ ftKernel.dwLowDateTime;ULONGLONG qwUser=(ULONGLONG) ftUser.dwHighDateTime)32)+ ftUser.dwLowDateTime;/將消耗時間相加,然后計算消耗在內核模式下的時間百分比ULONGLONG qwTotal=qwKernel+qwUser;DWORD dwPct=(DWORD)(ULONGLONG)100*qwKernel)/qwTotal); return(dwPct);/以下是將當前運行進程名和消耗在內核模式下的時間百分數都顯示出來的應用程序void
24、 mai n()/對當前系統(tǒng)中運行的進程拍取快照”HANDLE hSn apshot=:CreateToolhelp32S napshot(TH32CS_SNAPPROCESS,/ 提取當前進程0);/如果是當前進程,就將其忽略/初始化進程入口PROCESSENTRY32 pe;:ZeroMemory(&pe,sizeof(pe);pe.dwSize=sizeof(pe);/按所有進程循環(huán)BOOL bMore=:Process32First(hS napshot,&pe);while(bMore) /打開用于讀取的進程HANDLE hProcess=:Ope nProcess( PROCESS
25、_QUERY_INFORMA TION, FALSE, pe.th32ProcesslD);if (hProcess!=NULL)II指明要得到信息II不必繼承這一句柄II要打開的進程/找出進程的時間FILETIME ftCreatio n,ftExit,ftKernelMode,ftUserMode; :GetProcessTimes( hProcess, &ftCreatio n,&ftExit,&ftKernelMode,&ftUserMode);/所感興趣的進程/進程的啟動時間(絕對的)/結束時間(如果有的話) 在內核模式下消耗的時間 在用戶模式下消耗的時間/計算內核模式消耗的時間百分
26、比DWORD dwPctKernel=:GetKernelModePerce ntage( ftKernelMode,II在內核模式上消耗的時間ftUserMode);II在用戶模式下消耗的時間II向用戶顯示進程的某些信息std:cout “ Process ID: ” pe.th32ProcessID “ ,EXE file:” pe.szExeFile“,in kernel mode:” dwPctKernel CL 2-4.cpp請記錄:運行結果: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 冏od卄 &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)建進程實驗本實驗顯示了創(chuàng)建子進程的基本框架。該程序創(chuàng)建的子進程依然執(zhí)行父進程的程序代 碼,顯示它
31、的系統(tǒng)進程ID和它在進程列表中的位置。步驟1:登錄進入Windows。步驟 2:在 開始菜單中單擊 程序 ” Microsoft Visual Studio 6.0 Microsoft Visual C+6.0命令,進入 Visual C+窗口。 步驟3:編輯實驗源程序2-5.cpp。清單2-5創(chuàng)建子進程/ proccreate 項目# in clude # in clude # in clude ID值/創(chuàng)建傳遞過來的進程的克隆過程并賦于其 void StartClone(int nCloneID)/提取用于當前可執(zhí)行文件的文件名TCHAR szFile nameMAX_PATH;EXE文件
32、名和克隆ID:GetModuleFileName(NULL,szFile name,MAX_PATH);/格式化用于子進程的命令行并通知其TCHAR szCmdLi neMAX_PATH;:sprintf(szCmdLine, ” s %d ,szFilename,nClonelD);/用于子進程的 STARTUPINFO 結構 STARTUPINFO si;:ZeroMemory (rein terpret cast (&si), sizeof(si);si.cb=sizeof(si);/必須是本結構的大小/返回的用于子進程的進程信息PROCESS_INFORMATION pi;/利用同樣的
33、可執(zhí)行文件和命令行創(chuàng)建進程,并賦于其子進程的性質BOOL bCreateOK=:CreateProcess( szFile name, szCmdLi ne, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);/對子進程釋放引用 if (bCreateOK):CloseHa ndle(pi.hProcess); :CloseHa ndle(pi.hThread);int main (i nt argc,char* argv)/確定進程在列表中的位置int nClo ne(0); if (argc1)/從第二個參數中提取克隆
34、 :sscanf(argv1,“ d/產生這個EXE的應用程序的名稱/告訴其行為像一個子進程的標志/缺省的進程安全性/缺省的線程安全性/不繼承句柄/使用新的控制臺/新的環(huán)境/當前目錄/啟動信息/返回的進程信息ID,&n Clo ne);/顯示進程位置std:cout “ Process ID:“ :GetCurrentProcessld() “,Clone ID:“ nClonestd:endl;/檢查是否有創(chuàng)建子進程的需要const int c_nClon eMax=25;if (n Clo nec_ nClo neMax) -/發(fā)送新進程的命令行和克隆號StartClo ne(+nClo
35、ne);/在終止之前暫停一下,輸入一個字符后,程序結束,以便觀察std:cout ” in put a char:”;getchar();std:cout5. 正在運行的進程實驗本實驗的程序中列出了用于進程信息查詢的 API函數 GetProcessVersion()與 GetVersionEx()的共同作用,可確定運行進程的操作系統(tǒng)的版本號。步驟1:用Visual C+編輯實驗源程序 2-6.cpp。清單2-6使用進程和操作系統(tǒng)的版本信息/ version 項目# in clude # in clude /禾U用進程和操作系統(tǒng)的版本信息的簡單示例void mai n()/提取這個進程的ID號
36、DWORD dwldThis=:GetCurre ntProcessld();/獲得這一進程和報告所需的版本,也可以發(fā)送0以便指明這一進程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;/設置版本信息的數據結構,以便保存操作系統(tǒng)的版本信息OSVERSIONINFO
37、EX osvix;:ZeroMemory (&osvix,sizeof(osvix);osvix.dwOSVersio nln foSize=sizeof(osvix);/提取版本信息和報告:GetVersio nEx(rei nterpret_cast(&osvix); std:coutR unning on OS:osvix.dwMajorVers ion .osvix.dwMi no rVersio n std:e ndl;/顯示進程當前優(yōu)先級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、如果當前優(yōu)先級不是high,則改變優(yōu)先級:SetPriorityClass(:GetCurrentProcess(),/ 利用這一進程HIGH_PRIORITY_CLASS);/ 改變?yōu)?high/報告給用戶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當前 PID 信息:1020,requires OS:003) 當前操作系統(tǒng)版本:OS:5.1系統(tǒng)提示信息: Take Man ager shoul
41、d now now in dicate thisprocess is high priority清單2-6中的程序向讀者表明了如何獲得當前的PID和所需的進程版本信息。 為了運行這一程序,系統(tǒng)處理了所有的版本不兼容問題。接著,程序演示了如何使用 GetVersionEx() API函數來提取 OSVERSIONINFOEX 結構。 這一數據塊中包括了操作系統(tǒng)的版本信息。其中,“OS : 5.1表示當前運行的操作系統(tǒng)是:4) 表示Windows xp操作系統(tǒng)清單2-5的最后一段程序利用了操作系統(tǒng)的版本信息,以確認運行的是 Windows。代碼接著將當前進程的優(yōu)先級提高到比正常級別高。步驟5:單擊
42、Ctrl+Alt+Del鍵,進入“Windows任務管理器”,在應用程序”選項卡中右 鍵單擊“26”任務,在快捷菜單中選擇轉到進程”命令。請記錄:在“Windows任務管理器”的進程”選項卡中,與“2”任務對應的進程映像名稱 是(為什么?):VCSPAWN.EXE右鍵單擊該進程名,在快捷菜單中選擇設置優(yōu)先級”命令,可以調整該進程的優(yōu)先級(注意,如果要在任務管理器中觀察進程優(yōu)化級改變的情況,則最好采用鼠標雙擊可執(zhí)行文 件方式啟動進程,并在程序結束前設置一個暫停點,以便觀察)。除了改變進程的優(yōu)先級以外,還可以對正在運行的進程執(zhí)行幾項其他的操作,只要獲得其進程句柄即可。SetProcessAffi
43、ni tyMask() API函數允許開發(fā)人員將線程映射到處理器上; SetProcessPriorityBoost() API 可關閉前臺應用程序優(yōu)先級的提升;而 SetProcessWorkingSet()API可調節(jié)進程可用的非頁面RAM的容量;還有一個只對當前進程可用的API函數,即SetProcessShutdow nParameters(),可告訴系統(tǒng)如何終止該進程。6. 終止進程實驗在清單2-7列出的程序中,先創(chuàng)建一個子進程,然后向該子進程發(fā)出自殺彈”互斥體去終止子進程的運行。步驟1:用Visual C+編輯實驗源程序 2-7.cpp。清單2-7指令其父進程來 殺掉”自己的子進程
44、/ procterm 項目# in elude # in clude # in clude static LPCTSTR g_szMutexName=w2kdg .P rocTerm.mutex.Suicide;/創(chuàng)建當前進程的克隆進程的簡單方法void StartClo ne()/提取當前可執(zhí)行文件的文件名TCHAR szFile name MAX_PATH;:GetModuleFileName(NULL,szFile name,MAX_PATH);/格式化用于子進程的命令行,指明它是一個EXE文件和子進程TCHAR szCmdLi neMAX_PATH;:sprintf(szCmdLine
45、, %schild, szFilename);/子進程的啟動信息結構STARTUPINFO si;:ZeroMemory (rein terpret_cast(&si), sizeof(si); si.cb=sizeof(si);/應當是此結構的大小 /返回的用于子進程的進程信息PROCESS_INFORMATION pi;/用同樣的可執(zhí)行文件名和命令行創(chuàng)建進程,并指明它是一個子進程產生的應用程序名稱(本EXE文件)告訴我們這是一個子進程的標志 用于進程的缺省的安全性 用于線程的缺省安全性/不繼承句柄/創(chuàng)建新窗口,使輸出更直觀 新環(huán)境 當前目錄 啟動信息結構 返回的進程信息BOOL bCreateO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 借貸擔保條件合同范本
- 買賣旅游車車合同范本
- 制作類開口合同范本
- 包工包料安裝鍋爐合同范本
- 養(yǎng)豬場租賃合同范本
- 鄉(xiāng)鎮(zhèn)土地開發(fā)整改合同范本
- 佛山土地出租合同范本
- 付款協(xié)議合同范本
- 農村養(yǎng)牛蛙銷售合同范本
- ktv裝修乙方合同范本
- DB33- 1015-2021《居住建筑節(jié)能設計標準》
- 開學第一課(七下數學)
- 完整word版,“呂氏八字命理學”高級理論
- 中外合作辦學的可行性報告
- 飛達及其輔助機構
- 母嬰保健課程標準
- 深圳地鐵三號線正線信號系統(tǒng)
- 高中化學競賽培訓計劃
- 研發(fā)向善課程----綻放生命異彩
- 地球上的大氣知識結構圖
- 加油站數質量管理考核辦法版.doc
評論
0/150
提交評論