實驗一-進程控制描述與控制_第1頁
實驗一-進程控制描述與控制_第2頁
實驗一-進程控制描述與控制_第3頁
實驗一-進程控制描述與控制_第4頁
實驗一-進程控制描述與控制_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗一進程控制描述與控制第一局部Windows“任務管理器〞的進程管理背景知識Windows2000/XP/XP的任務管理器提供了用戶計算機上正在運行的程序和進程的相關信息,也顯示了最常用的度量進程性能的單位。使用任務管理器,可以翻開監視計算機性能的關鍵指示器,快速查看正在運行的程序的狀態,或者終止已停止響應的程序。也可以使用多個參數評估正在運行的進程的活動,以及查看CPU和內存使用情況的圖形和數據。其中:1)“應用程序〞選項卡顯示正在運行程序的狀態,用戶能夠結束、切換或者啟動程序。2)“進程〞選項卡顯示正在運行的進程信息。例如,可以顯示關于CPU和內存使用情況、頁面錯誤、句柄計數以及許多其他參數的信息。3)“性能〞選項卡顯示計算機動態性能,包括CPU和內存使用情況的圖表,正在運行的句柄、線程和進程的總數,物理、核心和認可的內存總數(KB)等。實驗目的通過在Windows任務管理器中對程序進程進行響應的管理操作,熟悉操作系統進程管理的概念,學習觀察操作系統運行的動態性能。工具/準備工作在開始本實驗之前,請回憶教科書的相關內容。需要準備一臺運行Windows2000/XP/XP操作系統的計算機。實驗內容與步驟\l"_1._使用任務管理器終止進程#_1._使用任務管理器終止進程"1.使用任務管理器終止進程\l"_2._顯示其他進程記數器#_2._顯示其他進程記數器"2.顯示其他進程計數器\l"_3._更改正在運行的程序的優先級#_3._更改正在運行的程序的優先級"3.更改正在運行的程序的優先級啟動并進入Windows環境,單擊Ctrl+Alt+Del鍵,或者右鍵單擊任務欄,在快捷菜單中單擊“任務管理器〞命令,或者是在點擊任務條上的“開始〞“運行〞,并輸入“taskmgr.exe〞翻開“任務管理器〞窗口。在本次實驗中,你使用的操作系統版本是:MicrosoftWindowsXPProfessional版本2002當前機器中由你翻開,正在運行的應用程序有:1〕實驗一進程控制描述與控制34-MicrosoftWord2)我的電腦3)MicrosoftInternetExplorer4)__________________________________________________________________5)__________________________________________________________________Windows“任務管理器〞的窗口由_5_個選項卡組成,分別是:1)應用程序________________________________________________2)進程__________________________________________________________3)性能_____________________________________________________________4)聯網______________________________________________________________5)用戶_____________________________________________________________當前“進程〞選項卡顯示的欄目分別是(可移動窗口下方的游標/箭頭,或使窗口最大化進行觀察):1.使用任務管理器終止進程步驟1:單擊“進程〞選項卡,一共顯示了__40_個進程。請試著區分一下,其中:系統(SYSTEM)進程有_25__個,填入表1-1中。表1-1實驗記錄映像名稱用戶名CPU內存使用

Wmiprvse

SYSTEM

00

5376k

cidaemon

SYSTEM

00

300k

cidaemon

SYSTEM00

856k

cidaemon

SYSTEM

50

284k

cisvc

SYSTEM

00

924k

csrss

SYSTEM

00

7412k

mqtgsvcSYSTEM

00

4144k

mqsvc

SYSTEM

00

6632k

snmp

SYSTEM

00

4340k

tcpservcs

SYSTEM

00

3840k

Smss

SYSTEM

00

404kSystemSYSTEM00300kSystemIdleProcessSYSTEM9928kwinlogonSYSTEM001684kservicesSYSTEM005776klsassSYSTEM001100ksvchostSYSTEM005324kmDNSResponderSYSTEM003920ksvchostSYSTEM0018716kinetinfoSYSTEM0010608ksamserviceSYSTEM002460kPGPservSYSTEM006880kPandoraServiceSYSTEM009148kspoolsvSYSTEM005688kMDMSYSTEM003416k效勞(SERVICE)進程有__5__個,填入表1-2中。表1-2實驗記錄映像名稱用戶名CPU內存使用

Svchost

LOCALSERVICE

00

3996k

alg

LOCALSERVICE00

3960k

msdtc

NETWORKSERVICE

00

5228k

Svchost

NETWORKSERVICE

00

5048k

Svchost

NETWORKSERVICE

00

3888k

用戶進程有___10__個,填入表1-3中。表1-3實驗記錄映像名稱用戶名CPU內存使用

realsched

Administrator

00

356k

Bufmonitor

Administrator

00

2988k

Ctfmon

Administrator

00

3512k

NCClt.dll

Administrator

00

9932k

LenRCClient

Administrator

00

4588k

PGPtray

Administrator

00

15100k

SogouCloud

Administrator

00

4920kExplorerAdministrator0010436kTaskmgrAdministrator002708kWINWORDAdministrator0071188k提示:在WindowsXP的“任務管理器〞中,“進程〞選項卡增加了一個“用戶名〞欄目,其中區分了SYSTEM、NETWORKSERVICE、LOCALSERVICE和用戶的不同進程類別。步驟2:單擊要終止的進程,然后單擊“結束進程〞按鈕。注意:終止進程時要小心。終止進程有可能導致不希望發生的結果,包括數據喪失和系統不穩定等。因為在被終止前,進程將沒有時機保存其狀態和數據。如果結束應用程序,您將喪失未保存的數據。如果結束系統效勞,系統的某些局部可能無法正常工作。以下是在windows7旗艦版下完成的終止進程,將結束它直接或間接創立的所有子進程。例如,如果終止了電子郵件程序(如Outlook8)的進程樹,那么同時也終止了相關的進程,如MAPI后臺處理程序mapisp32.exe。請將終止某進程后的操作結果與原記錄數據比照,發生了什么:____結束QQ.exe進程后,進程QQExternal.exe也會結束。_________________________________________________________________________________________________________________________________________________________________________________________________________________________從桌面啟動辦公軟件“Word〞,在任務管理器中找到該軟件的登記,并將其結束掉。再從任務管理器中分別找到以下程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,試著結束它們,觀察到的反響是任務管理器無法結束進程,原因是該進程為關鍵系統進程。在任務管理器中找到進程“explorer.exe〞,將之結束掉,并將桌面上你翻開的所有窗口最小化,看看你的計算機系統起來什么樣的變化桌面圖標變為空白、得到的結論是explorer.exe進程是windows資源管理器進程,是Windows圖形界面外殼程序〔說出explorer.exe進程的作用〕。2.顯示其他進程記數器在“進程〞選項卡上單擊“查看〞菜單,然后單擊“選擇列〞命令。單擊要增加顯示為列標題的工程,然后單擊“確定〞。為對進程列表進行排序,可在“進程〞選項卡上單擊要根據其進行排序的列標題。而為了要反轉排序順序,可再次單擊列標題。經過調整,“進程〞選項卡現在顯示的工程分別是:____映像名稱、PID、用戶名、回話ID、CPU、CPU時間、工作設置(內存)、峰值工作設置(內存)、工作設置增量(內存)、內存〔專用工作集〕、I/O讀取、I/O寫入、命令行、描述通過對“查看〞菜單的選擇操作,可以在“任務管理器〞中更改顯示選項:·在“應用程序〞選項卡上,可以按詳細信息、大圖標或小圖標查看。·在“性能〞選項卡上,可以更改CPU記錄圖,并顯示內核時間。“顯示內核時間〞選項在“CPU使用〞和“CPU使用記錄〞圖表上添加紅線。紅線指示內核操作占用的CPU資源數量。3.更改正在運行的程序的優先級要查看正在運行的程序的優先級,可單擊“進程〞選項卡,單擊“查看〞菜單,單擊“選擇列〞-“根本優先級〞命令,然后單擊“確定〞按鈕。為更改正在運行的程序的優先級,可在“進程〞選項卡上右鍵單擊您要更改的程序,指向“設置優先級〞,然后單擊所需的選項。更改良程的優先級可以使其運行更快或更慢(取決于是提升還是降低了優先級),但也可能對其他進程的性能有相反的影響。記錄操作后所體會的結果:_______改變進程的優先級可能會使系統不穩定________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________在多處理器計算機上,用戶還可以給處理器指派進程,將程序或進程的執行限制在選定的處理器上,但這有可能導致總體性能的下降。\l"_top#_top"第二局部Windows2000/XP進程控制背景知識\l"_1._創立進程#_1._創立進程"1.創立進程\l"_2._正在運行的進程#_2._正在運行的進程"2.正在運行的進程\l"_3._終止進程#_3._終止進程"3.終止進程Windows所創立的每個進程都從調用CreateProcess()API函數開始,該函數的任務是在對象管理器子系統內初始化進程對象。每一進程都以調用ExitProcess()或TerminateProcess()API函數終止。通常應用程序的框架負責調用ExitProcess()函數。對于C++運行庫來說,這一調用發生在應用程序的main()函數返回之后。1.創立進程CreateProcess()調用的核心參數是可執行文件運行時的文件名及其命令行。表1-4詳細地列出了每個參數的類型和名稱。表1-4CreateProcess()函數的參數參數名稱使用目的LPCTSTRlpApplivationName全部或局部地指明包括可執行代碼的EXE文件的文件名LPCTSTRlpCommandLine向可執行文件發送的參數LPSECURIITY_ATTRIBUTESlpProcessAttributes返回進程句柄的平安屬性。主要指明這一句柄是否應該由其他子進程所繼承LPSECURIITY_ATTRIBUTESlpThreadAttributes返回進程的主線程的句柄的平安屬性BOOLbInheritHandle一種標志,告訴系統允許新進程繼承創立者進程的句柄DWORDdwCreationFlage特殊的創立標志(如CREATE_SUSPENDED)的位標記LPVOIDlpEnvironment向新進程發送的一套環境變量;如為null值那么發送調用者環境LPCTSTRlpCurrentDirectory新進程的啟動目錄STARTUPINFOlpStartupInfoSTARTUPINFO結構,包括新進程的輸入和輸出配置的詳情LPPROCESS_INFORMATIONlpProcessInformation調用的結果塊;發送新應用程序的進程和主線程的句柄和ID可以指定第一個參數,即應用程序的名稱,其中包括相對于當前進程的當前目錄的全路徑或者利用搜索方法找到的路徑;lpCommandLine參數允許調用者向新應用程序發送數據;接下來的三個參數與進程和它的主線程以及返回的指向該對象的句柄的平安性有關。然后是標志參數,用以在dwCreationFlags參數中指明系統應該給予新進程什么行為。經常使用的標志是CREATE_SUSPNDED,告訴主線程立刻暫停。當準備好時,應該使用ResumeThread()API來啟動進程。另一個常用的標志是CREATE_NEW_CONSOLE,告訴新進程啟動自己的控制臺窗口,而不是利用父窗口。這一參數還允許設置進程的優先級,用以向系統指明,相對于系統中所有其他的活動進程來說,給此進程多少CPU時間。接著是CreateProcess()函數調用所需要的三個通常使用缺省值的參數。第一個參數是lpEnvironment參數,指明為新進程提供的環境;第二個參數是lpCurrentDirectory,可用于向主創進程發送與缺省目錄不同的新進程使用的特殊的當前目錄;第三個參數是STARTUPINFO數據結構所必需的,用于在必要時指明新應用程序的主窗口的外觀。CreateProcess()的最后一個參數是用于新進程對象及其主線程的句柄和ID的返回值緩沖區。以PROCESS_INFORMATION結構中返回的句柄調用CloseHandle()API函數是重要的,因為如果不將這些句柄關閉的話,有可能危及主創進程終止之前的任何未釋放的資源。2.正在運行的進程如果一個進程擁有至少一個執行線程,那么為正在系統中運行的進程。通常,這種進程使用主線程來指示它的存在。當主線程結束時,調用ExitProcess()API函數,通知系統終止它所擁有的所有正在運行、準備運行或正在掛起的其他線程。當進程正在運行時,可以查看它的許多特性,其中少數特性也允許加以修改。首先可查看的進程特性是系統進程標識符(PID),可利用GetCurrentProcessId()API函數來查看,與GetCurrentProcess()相似,對該函數的調用不能失敗,但返回的PID在整個系統中都可使用。其他的可顯示當前進程信息的API函數還有GetStartupInfo()和GetProcessShutdownParameters(),可給出進程存活期內的配置詳情。通常,一個進程需要它的運行期環境的信息。例如API函數GetModuleFileName()和GetCommandLine(),可以給出用在CreateProcess()中的參數以啟動應用程序。在創立應用程序時可使用的另一個API函數是IsDebuggerPresent()。可利用API函數GetGuiResources()來查看進程的GUI資源。此函數既可返回指定進程中的翻開的GUI對象的數目,也可返回指定進程中翻開的USER對象的數目。進程的其他性能信息可通過GetProcessIoCounters()、GetProcessPriorityBoost()、GetProcessTimes()和GetProcessWorkingSetSize()API得到。以上這幾個API函數都只需要具有PROCESS_QUERY_INFORMATION訪問權限的指向所感興趣進程的句柄。另一個可用于進程信息查詢的API函數是GetProcessVersion()。此函數只需感興趣進程的PID(進程標識號)。本實驗程序清單1-6中列出了這一API函數與GetVersionEx()的共同作用,可確定運行進程的系統的版本號。3.終止進程所有進程都是以調用ExitProcess()或者TerminateProcess()函數結束的。但最好使用前者而不要使用后者,因為進程是在完成了它的所有的關閉“職責〞之后以正常的終止方式來調用前者的。而外部進程通常調用后者即突然終止進程的進行,由于關閉時的途徑不太正常,有可能引起錯誤的行為。TerminateProcess()API函數只要翻開帶有PROCESS_TERMINATE訪問權的進程對象,就可以終止進程,并向系統返回指定的代碼。這是一種“野蠻〞的終止進程的方式,但是有時卻是需要的。如果開發人員確實有時機來設計“謀殺〞(終止別的進程的進程)和“受害〞進程(被終止的進程)時,應該創立一個進程間通訊的內核對象——如一個互斥程序——這樣一來,“受害〞進程只在等待或周期性地測試它是否應該終止。實驗目的1)通過創立進程、觀察正在運行的進程和終止進程的程序設計和調試操作,進一步熟悉操作系統的進程概念,理解Windows2000/XP進程的“一生〞。2)通過閱讀和分析實驗程序,學習創立進程、觀察進程和終止進程的程序設計方法。工具/準備工作在開始本實驗之前,請回憶教科書的相關內容。需要做以下準備:1)一臺運行Windows2000/XPProfessional操作系統的計算機。2)計算機中需安裝VisualC++6.0專業版或企業版。實驗內容與步驟\l"_1._創立進程_1#_1._創立進程_1"1.創立進程\l"_2._正在運行的進程_1#_2._正在運行的進程_1"2.正在運行的進程\l"_3._終止進程#_3._終止進程"3.終止進程請答復:Windows所創立的每個進程都是以調用______CreateProcess()____API函數開始和以調用______ExitProcess()_____或_____TerminateProcess()___API函數終止。1.創立進程本實驗顯示了創立子進程的根本框架。該程序只是再一次地啟動自身,顯示它的系統進程ID和它在進程列表中的位置。步驟1:登錄進入Windows2000/XPProfessional。步驟2:在“開始〞菜單中單擊“程序〞-“MicrosoftVisualStudio6.0”–“MicrosoftVisualC++6.0”命令,進入步驟3:在工具欄單擊“翻開〞按鈕,在“翻開〞對話框中找到并翻開實驗源程序1-5.cpp。清單1-5創立子進程//proccreate工程#include<windows.h>#include<iostream>#include<stdio.h>//創立傳遞過來的進程的克隆過程并賦于其ID值voidStartClone(intnCloneID){//提取用于當前可執行文件的文件名TCHARszFilename[MAX_PATH];::GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進程的命令行并通知其EXE文件名和克隆IDTCHARszCmdLine[MAX_PATH];::sprintf(szCmdLine,“\〞%s\〞%d〞,szFilename,nCloneID);//用于子進程的STARTUPINFO結構STARTUPINFOsi;::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));si.cb=sizeof(si); //必須是本結構的大小//返回的用于子進程的進程信息PROCESS_INFORMATIONpi;//利用同樣的可執行文件和命令行創立進程,并賦于其子進程的性質BOOLbCreateOK=::CreateProcess(szFilename, //產生這個EXE的應用程序的名稱szCmdLine, //告訴其行為像一個子進程的標志NULL, //缺省的進程平安性NULL, //缺省的線程平安性FALSE, //不繼承句柄CREATE_NEW_CONSOLE, //使用新的控制臺NULL, //新的環境NULL, //當前目錄&si, //啟動信息&pi); //返回的進程信息//對子進程釋放引用if(bCreateOK){::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);}}intmain(intargc,char*argv[]){//確定進程在列表中的位置intnClone(0);if(argc>1){//從第二個參數中提取克隆ID::sscanf(argv[1],“%d〞,&nClone);}//顯示進程位置std::cout<<“ProcessID:“<<::GetCurrentProcessId()<<“,CloneID:“<<nClone<<std::endl;//檢查是否有創立子進程的需要constintc_nCloneMax=25;if(nClone<C_nCloneMax){//發送新進程的命令行和克隆號StartClone(++nClone);}//在終止之前暫停一下(l/2秒)::Sleep(500);return0;}步驟4:單擊“Build〞菜單中的“Compile1-5.cpp〞命令,系統顯示: Thisbuildcommandrequiresanactiveprojectworkspace.Wouldyouliketo

createadefaultprojectworkspace? (build命令需要一個活動的工程工作空間。你是否希望建立一個缺省的工程工作空間?)單擊“是〞按鈕確認。系統對1-5.cpp進行編譯。步驟5:編譯完成后,單擊“Build〞菜單中的“Build1-5.exe〞命令,建立1-5.exe可執行文件。操作能否正常進行?如果不行,那么可能的原因是什么?_______不能正常運行,因為程序中出現許多語法和拼寫方面的錯誤______________步驟6:在工具欄單擊“ExecuteProgram〞(執行程序)按鈕,或者按Ctrl+F5鍵,或者單擊“Build〞菜單中的“Execute1-5.exe〞命令,執行1-5.exe程序。步驟7:按Ctrl+S鍵可暫停程序的執行,按Ctrl+Pause(Break)鍵可終止程序的執行。清單1-5展示的是一個簡單的使用CreateProcess()API函數的例子。首先形成簡單的命令行,提供當前的EXE文件的指定文件名和代表生成克隆進程的號碼。大多數參數都可取缺省值,但是創立標志參數使用了:_______CREATE_NEW_CONSOLE____________________________________標志,指示新進程分配它自己的控制臺,這使得運行例如程序時,在任務欄上產生許多活動標記。然后該克隆進程的創立方法關閉傳遞過來的句柄并返回main()函數。在關閉程序之前,每一進程的執行主線程暫停一下,以便讓用戶看到其中的至少一個窗口。CreateProcess()函數有___10___個核心參數?本實驗程序中設置的各個參數的值是:a.__szFilename_________________________________________;b.___szCmdLine_______________________________________;c.____NULL_______________________________________;d.____NULL______________________________________;e._____FALSE_______________________________________;f._____CREATE_NEW_CONSOLE_______________________________;g.____NULL_______________________________________;h.____NULL_______________________________________;i._____&si________________________________________;j._____&pi_______________________________________。程序運行時屏幕顯示的信息是:提示:局部程序在VisualC++環境完成編譯、鏈接之后,還可以在Windows2000/XP的“命令提示符〞狀態下嘗試執行該程序,看看與在可視化界面下運行的結果有沒有不同?為什么?2.正在運行的進程本實驗的程序中列出了用于進程信息查詢的API函數GetProcessVersion()與GetVersionEx()的共同作用,可確定運行進程的操作系統的版本號。步驟8:在VisualC++窗口的工具欄中單擊“翻開〞按鈕,在“翻開〞對話框中找到并翻開實驗源程序1-6.cpp。清單1-6使用進程和操作系統的版本信息//version工程#include<windows.h>#include<iostream>//利用進程和操作系統的版本信息的簡單例如voidmain(){//提取這個進程的ID號DWORDdwIdThis=::GetCurrentProcessId();//獲得這一進程和報告所需的版本,也可以發送0以便指明這一進程DWORDdwVerReq=::GetProcessVersion(dwIdThis);WORDwMajorReq=(WORD)dwVerReq>16);WORDwMinorReq=(WORD)dwVerReq&0xffff);std::cout<<“ProcessID:“<<dwIdThis<<“,requiresOS:“<<wMajorReq<<wMinorReq<<std

::endl

;//設置版本信息的數據結構,以便保存操作系統的版本信息OSVERSIONINFOEXosvix;::ZeroMemory(&osvix,sizeof(osvix));osvix.dwOSVersionInfoSize=sizeof(osvix);//提取版本信息和報告::GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvix));std::cout<<“RunningonOS:“<<osvix.dwMajorVersion<<“.〞<<osvix.dwMinorVersion<<std::endl;//如果是NTS(Windows2000/XP)系統,那么提高其優先權if(osvix.dwPlatformld==VER_PLATFORM_WIN32_NT&&osvix.dwMajorVersion>=5){//改變優先級::SetPriorityClass(::GetCurrentProcess(), //利用這一進程HIGH_PRIORITY_CLASS); //改變為high//報告給用戶std::cout<<“TaskManagershouldnownowindicatethis〞“processishighpriority.〞<<std::endl;}}步驟9:單擊“Build〞菜單中的“Compile1-6.cpp〞命令,再單擊“是〞按鈕確認。系統對1-6.cpp進行編譯。步驟10:編譯完成后,單擊“Build〞菜單中的“Build1-6.exe〞命令,建立1-6.exe可執行文件。操作能否正常進行?如果不行,那么可能的原因是什么?_______不能正常運行,因為程序中出現許多語法和拼寫方面的錯誤______________________________________________________________________________________步驟11:在工具欄單擊“ExecuteProgram〞(執行程序)按鈕,執行1-6.exe程序。運行結果:當前PID信息:______5310OS:00________________________________________當前操作系統版本:___6.1__________________________________________系統提示信息:_____TaskManagershouldnownowindicatethisprocessishighpriority.________________________________________________________________________清單1-6中的程序向讀者說明了如何獲得當前的PID和所需的進程版本信息。為了運行這一程序,系統處理了所有的版本不兼容問題。接著,程序演示了如何使用GetVersionEx()API函數來提取OSVERSIONINFOEX結構。這一數據塊中包括了操作系統的版本信息。其中,“OS:5.0”________________Windows2000________________________________清單1-6的最后一段程序利用了操作系統的版本信息,以確認運行的是Windows2000/XP。代碼接著將當前進程的優先級提高到比正常級別高。步驟12:單擊Ctrl+Alt+Del鍵,進入“Windows任務管理器〞,在“應用程序〞選項卡中右鍵單擊“1-6〞任務,在快捷菜單中選擇“轉到進程〞命令。在“Windows任務管理器〞的“進程〞選項卡中,與“1-6〞任務對應的進程映像名稱是(為什么?):_____________VCSPAWN.EXE___________________右鍵單擊該進程名,在快捷菜單中選擇“設置優先級〞命令,可以調整該進程的優先級,如設置為“高〞后重新運行1-6.exe程序,屏幕顯示有變化嗎?為什么?______PID信息變為4488OS:00_________________________________________________________________________________________________________________________________________________________________________除了改變進程的優先級以外,還可以對正在運行的進程執行幾項其他的操作,只要獲得其進程句柄即可。SetProcessAffinityMask()API函數允許開發人員將線程映射到處理器上;SetProcessPriorityBoost()API可關閉前臺應用程序優先級的提升;而SetProcessWorkingSet()API可調節進程可用的非頁面RAM的容量;還有一個只對當前進程可用的API函數,即SetProcessShutdownParameters(),可告訴系統如何終止該進程。3.終止進程在清單1-7列出的程序中,先創立一個子進程,然后指令它發出“自殺彈〞互斥體去終止自身的運行。步驟13:在VisualC++窗口的工具欄中單擊“翻開〞按鈕,在“翻開〞對話框中找到并翻開實驗源程序1-7.cpp。清單1-7指令其子進程來“殺掉〞自己的父進程//procterm工程#include<windows.h>#include<iostream>#include<stdio.h>staticLPCTSTRg_szMutexName=“w2kdg.ProcTerm.mutex.Suicide〞;//創立當前進程的克隆進程的簡單方法voidStartClone(){//提取當前可執行文件的文件名TCHARszFilename[MAX_PATH];::GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進程的命令行,指明它是一個EXE文件和子進程TCHARszCmdLine[MAX_PATH];::sprintf(szCmdLine,“\〞%s\“child〞,szFilename);//子進程的啟動信息結構STARTUPINFOsi;::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));si.cb=sizeof(si); //應當是此結構的大小//返回的用于子進程的進程信息PROCESS_INFORMATIONpi;//用同樣的可執行文件名和命令行創立進程,并指明它是一個子進程BOOLbCreateOK=::CreateProcess(szFilename, //產生的應用程序名稱(本EXE文件)szCmdLine, //告訴我們這是一個子進程的標志NULL, //用于進程的缺省的平安性NULL, //用于線程的缺省平安性FALSE, //不繼承句柄CREATE_NEW_CONSOLE, //創立新窗口,使輸出更直觀NULL, //新環境NULL, //當前目錄&si, //啟動信息結構&pi); //返回的進程信息//釋放指向子進程的引用if(bCreateOK){::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);}}voidParent(){//創立“自殺〞互斥程序體HANDLEhMutexSuicide=::CreateMutex(NULL, //缺省的平安性TRUE, //最初擁有的g_szMutexName); //為其命名if(hMutexSuicide!=NULL){//創立子進程std::cout<<“Creatingthechildprocess.〞<<std::endl;::StartClone();//暫停::sleep(5000);//指令子進程“殺〞掉自身std::cout<<“Tellingthechildprocesstoquit.〞<<std::endl;::ReleaseMutex(hMutexSuicide);//消除句柄::CloseHandle(hMutexSuicide);}}voidChild(){//翻開“自殺〞互斥體HANDLEhMutexSuicide=::OpenMutex(SYNCHRONIZE, //翻開用于同步FALSE, //不需要向下傳遞g_szMutexName); //名稱if(hMutexSuicide!=NULL){//報告正在等待指令std::cout<<“Childwaitingforsuicideinstructions.〞<<std::endl;::WaitForSingleObject(hMutexSuicide,INFINITE);

溫馨提示

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

評論

0/150

提交評論