資源描述:
《實(shí)驗(yàn)2:windows應(yīng)用程序基礎(chǔ)和進(jìn)程控制》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、實(shí)驗(yàn)二:Windows進(jìn)程控制1.實(shí)驗(yàn)?zāi)康拿總€進(jìn)程都有一個獨(dú)立的受到保護(hù)的地址空間,其他進(jìn)程不能訪問。一個進(jìn)程可以包含一個或更多的線程。進(jìn)程能夠在其內(nèi)部創(chuàng)建新的、獨(dú)立的線程,并且管理對象間的通信和同步。通過對Windows系統(tǒng)編程,進(jìn)一步熟悉操作系統(tǒng)的基本概念,較好地理解Windows操作系統(tǒng)的系統(tǒng)結(jié)構(gòu)和編程特點(diǎn)。2.進(jìn)程控制Windows所創(chuàng)建的每個進(jìn)程都從調(diào)用CreateProcess()API函數(shù)開始,該函數(shù)的任務(wù)是在對象管理器子系統(tǒng)內(nèi)初始化進(jìn)程對象。每一進(jìn)程都以調(diào)用ExitProcess()或Terminat
2、eProcess()API函數(shù)終止。通常應(yīng)用程序的框架負(fù)責(zé)調(diào)用ExitProcess()函數(shù)。對C++運(yùn)行庫來說,這一調(diào)用發(fā)生在應(yīng)用程序的main()函數(shù)返回之后,如果采用C運(yùn)行庫,則調(diào)用WinMain()函數(shù)。通過創(chuàng)建進(jìn)程、觀察正在運(yùn)行的進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)和調(diào)試操作,進(jìn)一步熟悉操作系統(tǒng)的進(jìn)程概念,理解Windows進(jìn)程的生命周期。2.1進(jìn)程控制相關(guān)的API基本的Win32進(jìn)程管理函數(shù)是CreateProcess,它可以創(chuàng)建擁有單個線程的進(jìn)程。因?yàn)檫M(jìn)程需要代碼,所以有必要指定可執(zhí)行程序文件名作為CreatePr
3、ocess調(diào)用的一部分。CreateProcess有10個參數(shù)支持其靈活性和強(qiáng)大功能。該函數(shù)并不返回一個HANDLE,而是在一個結(jié)構(gòu)(在調(diào)用中指定)中返回表示進(jìn)程和線程的兩個句柄。2.1.1創(chuàng)建進(jìn)程CreateProcess()函數(shù)函數(shù)格式:BOOLCreateProcess(LPCTSTRlpApplicationName,LPTSTRlpCommandLine,LPSECURITY_ATTRIBUTESlpProcessAttributes,LPSECURITY_ATTRIBUTESlpThreadAttribu
4、tes,BOOLbInheritHandles,DWORDdwCreationFlags,LPVOIDlpEnvironment,LPCTSTRlpCurrentDirectory,LPSTRATUPINFOlpStartupInfo,LPPROCESS_INFORMATIONlpProcessInformation);參數(shù):(1)lpszApplicationName和lpCommandLine指定了新進(jìn)程將使用的可執(zhí)行文件和傳遞給新進(jìn)程的命令行字符串。lpszCommandLine可以設(shè)定CreateProces
5、s中用于創(chuàng)建新進(jìn)程的命令行。CreateProcess在解析lpszCommandLine字符串的時(shí)候,它先查看字符串中的第一個符號。如果它是一個可執(zhí)行文件名且不含有擴(kuò)展名,就假定它的擴(kuò)展名為EXE。CreateProcess將按照以下順序來搜索可執(zhí)行文件:1)含有調(diào)用進(jìn)程的EXE文件的目錄;2)調(diào)用進(jìn)程的當(dāng)前目錄;3)Windows系統(tǒng)目錄,該目錄由GetSystemDirectory函數(shù)得到;4)Windows目錄,該目錄由GetWindowsDirectory函數(shù)得到;5)列在PATH環(huán)境變量中的目錄。當(dāng)然,如
6、果文件名中包含完整的路徑,系統(tǒng)就使用完整路徑搜索可執(zhí)行文件。如果系統(tǒng)找到了可執(zhí)行文件,就創(chuàng)建一個新進(jìn)程,并為它生成一個4GB的地址空間,從而使可執(zhí)行文件的代碼和數(shù)據(jù)映射到這個地址空間。(2)lpProcessAttribute和lpThreadAttribute是指向進(jìn)程和線程安全屬性結(jié)構(gòu)的指針。當(dāng)用NULL表示時(shí),為默認(rèn)的安全性。(3)FInheritHandles表明新進(jìn)程是否繼承調(diào)用進(jìn)程的打開句柄的副本。繼承的句柄與原來的句柄具有相同屬性。(4)FdwCreate是幾個標(biāo)志的組合。其中包含以下幾個標(biāo)志:1)CR
7、EATE_SUSPENDED:新進(jìn)程的主線程創(chuàng)建時(shí)處于掛起狀態(tài),直到調(diào)用ResumeThread函數(shù)時(shí)才能運(yùn)行。2)DETACHED_PROCESS和CREATE_NEW_CONSOLE相互排斥,二者不能同時(shí)使用。第一個標(biāo)志是創(chuàng)建沒有控制臺的進(jìn)程,第二個標(biāo)志是創(chuàng)建新的有控制臺的進(jìn)程。如果二者都沒有設(shè)置,進(jìn)程將繼承父進(jìn)程的控制臺。3)CREATE_NEW_PROCESS_GROUP指定新進(jìn)程是新進(jìn)程組的根進(jìn)程。如果組中所有的進(jìn)程都共享同一控制臺,則它們都將接收控制臺的控制信號。(5)lpvEnvironment指向新進(jìn)
8、程的環(huán)境塊。如果此值為NULL,進(jìn)程會使用父進(jìn)程的環(huán)境塊。環(huán)境塊包含名稱和值字符串,如搜索路徑。(6)lpszCurDir指向新進(jìn)程的驅(qū)動器和目錄。若為NULL,將使用父進(jìn)程的工作目錄。(7)lpsiStartInfo指向新進(jìn)程的主窗口外觀和標(biāo)準(zhǔn)設(shè)備句柄。使用GetStartupInfo函數(shù)得到父進(jìn)程信息。(8)lpProcessInforma