版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)1進(jìn)程的描述與控制Windows 2000編程(實(shí)驗(yàn)估計(jì)時(shí)間:100分鐘)1.1 背景知識(shí) Windows 2000 可以識(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 2000是以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 2000的服務(wù)通常要向系統(tǒng)用戶提供所需功能。 服務(wù)應(yīng)用程序類
2、型需要ServiceMail()函數(shù),由服務(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ā)者提供的main()、Servic
3、emain()或WinMain()函數(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.2 實(shí)驗(yàn)?zāi)康?通過(guò)對(duì)Windows 2000編程,進(jìn)一步熟悉操作系統(tǒng)的基本概念,較好地理解Windows 2000的結(jié)構(gòu)。1.3 工具/準(zhǔn)備工作 在開始本實(shí)驗(yàn)之前,請(qǐng)回顧教科書的相關(guān)內(nèi)容。 您需要做以下準(zhǔn)備: 1)一臺(tái)運(yùn)行Windows 2000 Professional 操作系統(tǒng)的
4、計(jì)算機(jī)。 2)計(jì)算機(jī)中需安裝Visual C+ 6.0 專業(yè)版或企業(yè)版。1.4 實(shí)驗(yàn)內(nèi)容與步驟 (1)、簡(jiǎn)單的控制臺(tái)應(yīng)用程序 我們先來(lái)創(chuàng)建一個(gè)名為“Hello,World”的應(yīng)用程序。 步驟1:登錄進(jìn)入Windows 2000 Professional。 步驟2:利用輸入輸出類iostream和std:cout編寫一個(gè)控制臺(tái)小程序,在屏幕上顯示“hello,windows 2000”,并把代碼保存為1-1.cpp。 步驟3:在“開始”菜單中單擊“程序”、“附件”、“命令提示符”,進(jìn)入Windows “命令提示符”窗口,并利用簡(jiǎn)單的標(biāo)準(zhǔn)命令行: C:CL 1-1.cpp來(lái)創(chuàng)建可執(zhí)行的1-1.ex
5、e。 操作能否正常進(jìn)行?如果不行,原因是什么?解:首先將所需要的文件拷貝到相應(yīng)的目錄中,執(zhí)行命令發(fā)現(xiàn)不能運(yùn)行成功,首先是C盤根目錄下面沒(méi)有CL.exe文件.進(jìn)入到文件夾C:Program FilesMicrosoft Visual StudioVC98Bin之后可以發(fā)現(xiàn)CL.exe文件,重新運(yùn)行命令后仍然不能成功,顯示fatal error C1034: iostream: no include path set錯(cuò)誤,經(jīng)查找資料可知,應(yīng)該在命令行中首先運(yùn)行VCVARS32.BAT 命令如下:C:Program FilesMicrosoft Visual StudioVC98BinVCVARS3
6、2.BAT然后運(yùn)行命令成功,成功生成1-1.exe 步驟4:運(yùn)行1-1.exe程序,產(chǎn)生用戶鍵入的一行文字。 運(yùn)行結(jié)果(如果運(yùn)行不成功,原因是什么?): 解:運(yùn)行命令成功C:Program FilesMicrosoft Visual StudioVC98Bin1-1.exe輸出結(jié)果:hello,windows 2000 (2)、GUI應(yīng)用程序 在下面的實(shí)驗(yàn)中,用C+編譯器創(chuàng)建一個(gè)GUI應(yīng)用程序,代碼應(yīng)包括WinMain()方法,這是GUI類型的應(yīng)用程序的標(biāo)準(zhǔn)入口點(diǎn)。 步驟1:用Windows.h頭文件、WinMain()、MessageBox() API函數(shù)、用pragma指令指示編譯器/連接
7、器找到User32.lib庫(kù)文件編寫一段小程序,在屏幕上顯示一個(gè)窗口,消息框中顯示“Hello,Windows 2000,消息框標(biāo)是用Greeting,消息框中設(shè)一個(gè)“OK”按鈕,代碼保存為1-2.cpp 步驟2:在“命令提示符”窗口運(yùn)行CL.exe,產(chǎn)生1-2.exe文件: C:CL 1-2.cpp 運(yùn)行結(jié)果: 解:運(yùn)行結(jié)果如下:C:Program FilesMicrosoft Visual StudioVC98BinCL 1-2.cppMicrosoft (R) 32-bit C/C+ Optimizing Compiler Version 12.00.8168 for 80x86Copy
8、right (C) Microsoft Corp 1984-1998. All rights reserved.1-2.cppMicrosoft (R) Incremental Linker Version 6.00.8168Copyright (C) Microsoft Corp 1992-1998. All rights reserved./out:1-2.exe1-2.obj運(yùn)行1-2.exe 3、進(jìn)程對(duì)象 操作系統(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)用,在
9、系統(tǒng)中運(yùn)行的任何進(jìn)程都可調(diào)用GetCurrentProcess() API函數(shù),返回標(biāo)識(shí)進(jìn)程本身的句柄;再利用GetPriorityClass()獲得進(jìn)程的優(yōu)先級(jí),用cout函數(shù)在屏幕上把得到的進(jìn)程優(yōu)先級(jí)在屏幕上顯示出來(lái)。 步驟1:將程序鍵入記事本中,并把代碼保存為1-3.cpp 步驟2:在“命令提示符”窗口運(yùn)行CL.exe,產(chǎn)生1-3.exe文件: C:CL 1-3.cpp 運(yùn)行結(jié)果 C:Program FilesMicrosoft Visual StudioVC98BinCL 1-3.cpp/out:1-3.exe1-3.obj運(yùn)行:C:Program FilesMicrosoft Vis
10、ual StudioVC98Bin1-3.exe輸出結(jié)果:Current process priority:normal截圖如下: 步驟3:編寫一段程序,利用句柄查出進(jìn)程的詳細(xì)信息,首先利用Windows 2000的新特性工具幫助庫(kù)tlhelp.h來(lái)獲得當(dāng)前運(yùn)行的所有進(jìn)程的快照。然后應(yīng)用程序進(jìn)入快照中的每一個(gè)進(jìn)程,得到其以PROCESSENTRY32結(jié)構(gòu)表示的屬性,這一結(jié)構(gòu)用來(lái)向OpenProcess() API函數(shù)提供進(jìn)程的ID。Windows跟蹤每一進(jìn)程的有關(guān)時(shí)間,通過(guò)打開的進(jìn)程句柄和GetProcessTime() API來(lái)查詢得到有關(guān)時(shí)間。然后計(jì)算進(jìn)程在內(nèi)核模式下消耗的時(shí)間占總時(shí)間的百
11、分比。 將程序鍵入記事本中,并把代碼保存為1-4.cpp。 步驟4:在“命令提示符”窗口運(yùn)行CL.exe,產(chǎn)生1-4.exe文件: C:CL 1-4.cpp 運(yùn)行結(jié)果:C:Program FilesMicrosoft Visual StudioVC98BinCL 1-4.cppMicrosoft (R) 32-bit C/C+ Optimizing Compiler Version 12.00.8168 for 80x86Copyright (C) Microsoft Corp 1984-1998. All rights reserved.1-4.cppMicrosoft (R) Increm
12、ental Linker Version 6.00.8168Copyright (C) Microsoft Corp 1992-1998. All rights reserved./out:1-4.exe1-4.obj運(yùn)行1-4.exe1.5 實(shí)驗(yàn)總結(jié)1) 首先查找CL.exe文件的位置,然后將所需要的cpp代碼文件拷貝到CL.exe所在的文件夾之中,保證在命令行模式執(zhí)行命令的過(guò)程中不會(huì)出現(xiàn)找不到文件之類的低級(jí)錯(cuò)誤。2) 通過(guò)本次實(shí)驗(yàn)我還學(xué)到了如何在命令行模式下編譯C+程序,在直接嘗試中遇到許多的錯(cuò)誤,在解決錯(cuò)誤的過(guò)程中我學(xué)到:cl.exe要用到MSDev98Bin目錄下的MSPDB60.DL
13、L解決第一個(gè)錯(cuò)誤的方法有以下幾種:A. 將電腦目錄C:Program FilesMicrosoft Visual StudioCOMMONMSDev98Bin下面的MSPDB60.DLL文件拷貝到CL.exe所在的文件夾中B在“我的電腦-屬性-高級(jí)-環(huán)境變量”中, 添加如下變量:INCLUDEC:Program FilesMicrosoft Visual StudioVC98IncludeLIBC:Program FilesMicrosoft Visual StudioVC98LibC:ProgramFilesMicrosoftVisualStudioCommonMSDev98Bin;X:Pr
14、ogram FilesMicrosoft Visual StudioVC98Bin3) 第三個(gè)錯(cuò)誤fatal error C1034: iostream: no include path set錯(cuò)誤。解決方案:經(jīng)查找資料可知,應(yīng)該在命令行中首先運(yùn)行VCVARS32.BAT 命令如下:C:Program FilesMicrosoft Visual StudioVC98BinVCVARS32.BAT然后運(yùn)行命令成功。在解決問(wèn)題的同時(shí)我也學(xué)到:vcvars32.bat 文件設(shè)置適當(dāng)?shù)沫h(huán)境變量以啟用 32 位命令行編譯。4) 關(guān)于程序文件文件 1-1.cpp內(nèi)容比較簡(jiǎn)單,就是用C+輸出hello,wi
15、ndows 2000文件1-2.cpp是用Windows.h頭文件、WinMain()、MessageBox() API函數(shù)、用pragma指令指示編譯器/連接器找到User32.lib庫(kù)文件編寫一段小程序,也就是一個(gè)簡(jiǎn)單的windows編程,再次熟悉了WinMain()函數(shù)。文件1-3.cpp是一個(gè)簡(jiǎn)單的進(jìn)程句柄的應(yīng)用,在系統(tǒng)中運(yùn)行的任何進(jìn)程都可調(diào)用GetCurrentProcess() API函數(shù),返回標(biāo)識(shí)進(jìn)程本身的句柄;再利用GetPriorityClass()獲得進(jìn)程的優(yōu)先級(jí),用cout函數(shù)在屏幕上把得到的進(jìn)程優(yōu)先級(jí)在屏幕上顯示出來(lái)。文件1-4.cpp利用Windows 2000的新特
16、性工具幫助庫(kù)tlhelp.h來(lái)獲得當(dāng)前運(yùn)行的所有進(jìn)程的快照。1.6 實(shí)驗(yàn)評(píng)價(jià)(教師) 實(shí)驗(yàn)2進(jìn)程的描述與控制Windows 2000進(jìn)程的一生(實(shí)驗(yàn)估計(jì)時(shí)間:100分鐘)2.1 背景知識(shí) Windows 2000 所創(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()函數(shù),對(duì)于C+運(yùn)行庫(kù)來(lái)說(shuō),這一調(diào)用發(fā)生在應(yīng)用程序的main()函數(shù)返回之后。 1. 創(chuàng)建進(jìn)程 CreateProc
17、ess()調(diào)用的核心參數(shù)是可執(zhí)行文件運(yùn)行時(shí)的文件名及其命令行。表2-1詳細(xì)地列出了每個(gè)參數(shù)的類型和名稱。表2-1 實(shí)驗(yàn)記錄參數(shù)名稱使用目的LPCTSTR lpApplivationNAME全部或部分地指明包括可執(zhí)行代碼的EXE文件的文件名LPCTSTR lpCommandLine向可執(zhí)行文件發(fā)送的參數(shù)LPSECURIITY_ATTRIBUTESlpProcessAttributes返回進(jìn)程句柄的安全屬性,主要指明這一句柄是否應(yīng)該由其他子進(jìn)程所繼承。LPSECURIITY_ATTRIBUTESlpThreadAttributes返回進(jìn)程的主線程的句柄的安全屬性BOOL bInheritHandl
18、e一種標(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)PPROCESS_INFORMATION lpProcessInformation調(diào)用的結(jié)果塊;發(fā)送新應(yīng)用程序的進(jìn)程和主線程的句柄和ID 可以指定第一個(gè)參數(shù),即應(yīng)用程序
19、的名稱,其中包括相對(duì)于當(dāng)前進(jìn)程的當(dāng)前目錄的全路徑或者利用搜索方法找到路徑;lpCommandLine參數(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)程。另一個(gè)常用的標(biāo)志是CREATE_NEW_CONSOLE,告訴新進(jìn)程啟動(dòng)自己的控制臺(tái)窗口,而不是利用父窗口,這一參數(shù)還允許設(shè)置進(jìn)程的優(yōu)先級(jí),用以向系統(tǒng)指明,相對(duì)于系
20、統(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ù)是lpCurrentDirectory,可用于向主創(chuàng)進(jìn)程發(fā)送與缺省目錄不同的新進(jìn)程使用的特殊的當(dāng)前目錄;第三個(gè)參數(shù)是STARTUPINFO數(shù)據(jù)結(jié)構(gòu)中所必需的,用于在必要時(shí)指明新應(yīng)用程序的主窗口的外觀。 CreateProcess()的最后一個(gè)參數(shù)是用于新進(jìn)程對(duì)象及其主線程的句柄和ID的返回值緩沖區(qū),以PROCESS_INFORMATION結(jié)構(gòu)中返回的句柄調(diào)用Close_Handle()
21、API函數(shù)是重要的,因?yàn)槿绻粚⑦@些句柄關(guān)閉的話,有可能危及主創(chuàng)進(jìn)程終止之前的任何未釋放的資源。 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)程特性是系統(tǒng)進(jìn)程標(biāo)識(shí)符(PID),可利用GetCurrentProcessId() API函數(shù)來(lái)查看,與GetCurrentProcess()相似,對(duì)該函數(shù)的調(diào)用不能失敗
22、,但返回的PID在整個(gè)系統(tǒng)中都可使用,其他可顯示當(dāng)前進(jìn)程信息的API函數(shù)還有GetStartInfo()和GetprocessShutdownParameters(),可給出進(jìn)程存活期內(nèi)的配置詳情。 通常,一個(gè)進(jìn)程需要它運(yùn)行期環(huán)境的信息,例如API函數(shù)GetModuleFileName()和GetcommandLine(),可以給出CreateProcess()中的參數(shù)以啟動(dòng)應(yīng)用程序。在創(chuàng)建應(yīng)用程序時(shí)可使用的另一個(gè)API函數(shù)是IsDebuggerPresent()。 可利用API函數(shù)GetGuiResources()來(lái)查看進(jìn)程的GUI資源,此函數(shù)既可返回指定進(jìn)程中的打開的GUI對(duì)象的數(shù)目,也可
23、返回指定進(jìn)程中打開的USER對(duì)象的數(shù)目。進(jìn)程的其他性能信息可通過(guò)GetProcessIoCounters()、GetProcessPriorityBoost()、GetProcessTimes()和GetProcessWorkingSetSize() API得到,以上這幾個(gè)API函數(shù)都只需要具有PROCESS_QUERY_INFORMATION訪問(wèn)權(quán)限的指向所感興趣進(jìn)程的句柄。 另一個(gè)可用于進(jìn)程信息查詢的API函數(shù)是GetProcessVersion(),此函數(shù)只需感興趣進(jìn)程的PID(進(jìn)程標(biāo)識(shí)號(hào))。 3. 終止進(jìn)程 所有進(jìn)程都是以調(diào)用ExitProcess()或者TerminateProces
24、s()函數(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ù)只要打開帶有PROCESS_TERMINATE訪問(wèn)權(quá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)程只在等待或同期性
25、地測(cè)試它是否應(yīng)該終止。2.2 實(shí)驗(yàn)?zāi)康?1)通過(guò)創(chuàng)建進(jìn)程、觀察正在運(yùn)行的進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)和調(diào)試操作,進(jìn)一步熟悉操作系統(tǒng)的進(jìn)程概念,理解Windows 2000進(jìn)程的“一生”。 2)通過(guò)編寫和分析實(shí)驗(yàn)程序,學(xué)習(xí)創(chuàng)建進(jìn)程、觀察進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)方法。2.3 工具/準(zhǔn)備工作 在開始本實(shí)驗(yàn)之前,請(qǐng)回顧教科書的相關(guān)內(nèi)容。 您需要做以下準(zhǔn)備: 1)一臺(tái)運(yùn)行Windows 2000 Professional 操作系統(tǒng)的計(jì)算機(jī)。 2)計(jì)算機(jī)中需安裝Visual C+ 6.0 專業(yè)版或企業(yè)版。2.4 實(shí)驗(yàn)內(nèi)容與步驟 請(qǐng)回答: Windows所創(chuàng)建的每個(gè)進(jìn)程都是以調(diào)用CreateProcess()
26、API函數(shù)開始和以調(diào)用ExitProcess()或TerminateProcess() API函數(shù)終止。 1、創(chuàng)建進(jìn)程 本實(shí)驗(yàn)學(xué)習(xí)創(chuàng)建進(jìn)程的基本框架。該程序要求啟動(dòng)自身,顯示它的系統(tǒng)進(jìn)程ID和它在進(jìn)程列表中的位置。 步驟1:登錄進(jìn)入Windows 2000 Professional。 步驟2:在“開始”菜單中單擊“程序”、“Microsoft Visual Studio 6.0”“Microsoft Visual C+ 6.0”,進(jìn)入Visual C+窗口。 步驟3:在工具欄單擊“新建”按鈕,輸入代碼保存為2-1.cpp。 參考類和函數(shù):windows.h、iostream、stdio.h、S
27、tartClone()、GetModuleFileName、ZeroMemory。 步驟4:?jiǎn)螕簟癇uild”菜單中的“Compile 2-1.cpp”命令,對(duì)2-1.cpp進(jìn)行編譯。 步驟5:編譯完成后,單擊“Build”菜單中的“Build 2-1.exe”命令,建立2-1.exe可執(zhí)行文件。 操作能否正常進(jìn)行,如果不行,原因是什么?解:不能正常運(yùn)行:屏幕一直在閃爍。原因:在錯(cuò)誤的情況下,閃屏的ID一直是0,也就是說(shuō) if (nClone c_nCloneMax) / 發(fā)送新進(jìn)程的命令行和克隆號(hào) StartClone(+nClone) ; 中的nClone一直為0,導(dǎo)致類似死循環(huán)的窗口閃爍
28、。解決方案:語(yǔ)句: sprintf(szCmdLine,%sd%,szFilename,nCloneID);有語(yǔ)法錯(cuò)誤,將其該為%d 步驟6:在工具欄單擊“Execute program”按鈕,或者按Ctrl+F5鍵,或者單擊“Build”菜單中的“Execute 2-1.exe”命令,執(zhí)行2-1.exe程序。 步驟7:按Ctrl+S鍵可暫停程序的執(zhí)行,按Ctrl+Pause(Break)鍵可終止程序的執(zhí)行。程序運(yùn)行時(shí)屏幕顯示的信息是:顯示Clone從0-25的過(guò)程中 最后程序顯示的結(jié)果是: 2. 正在運(yùn)行的進(jìn)程 本實(shí)驗(yàn)用進(jìn)程信息查詢的API函數(shù)GetProcessVersion()與GetV
29、ersionEx(),確定運(yùn)行進(jìn)程的操作系統(tǒng)的版本號(hào)。 步驟1:在工具欄單擊“新建”按鈕,編寫代碼保存為2-2.cpp。 步驟2:?jiǎn)螕簟癇uild”菜單中的“Compile 2-2.cpp”命令,系統(tǒng)對(duì)2-2.cpp進(jìn)行編譯。 步驟3:編譯完成后,單擊“Build”菜單中的“Build 2-2.exe”命令,建立2-2.exe可執(zhí)行文件。 操作能否正常進(jìn)行,如果不行,原因是什么? 程序能夠正確執(zhí)行。輸出結(jié)果是: 步驟4:在工具欄單擊“Execute program”按鈕,執(zhí)行2-2.exe程序。 運(yùn)行結(jié)果: 當(dāng)前PID信息: 當(dāng)前操作系統(tǒng)版本: 系統(tǒng)提示信息:和系統(tǒng)對(duì)比:可見顯示是正確的。 除
30、了改變進(jìn)程的優(yōu)先級(jí)以外,還可以對(duì)正在運(yùn)行的進(jìn)程執(zhí)行幾項(xiàng)其他的操作,只要獲得其進(jìn)程句柄即可,SetProcessAffinityMask() API函數(shù)允許開發(fā)人員將線程映射到處理器上;SetProcessAffinityBoost() 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ù),即SetProcessShutdownParameters(),可告訴系統(tǒng)如何終止該進(jìn)程。 3. 終止進(jìn)程 步驟1:在工具欄單擊“新建”按鈕,編寫代碼保存為2-3.cpp。 步驟2:?jiǎn)螕簟癇uild
31、”菜單中的“Compile 2-3.cpp”命令,再單擊“是”按鈕確認(rèn),系統(tǒng)對(duì)2-3.cpp進(jìn)行編譯。 步驟3:編譯完成后,單擊“Build”菜單中的“Build 2-3.exe”命令,建立2-3.exe可執(zhí)行文件。 操作能否正常進(jìn)行,如果不行,原因是什么? 解:能正確執(zhí)行 步驟4:在工具欄單擊“Execute program”按鈕,執(zhí)行2-3.exe程序。 運(yùn)行結(jié)果及說(shuō)明:運(yùn)行程序之后,顯示兩個(gè)窗口:父窗口和子窗口 等待一段時(shí)間之后子進(jìn)程殺死自身進(jìn)程修改部分程序代碼: std : cout Creating the child process. std : endl; : StartClon
32、e() ; / 暫停 : Sleep(5000) ; / 指令子進(jìn)程“殺”掉自身 std : cout Telling the child process to quit. 1 & : strcmp(argv1 , child )= 0) Child() ; else Parent() ; return 0;當(dāng)mian()函數(shù)中的argc1 并且 : strcmp(argv1 , child )= 0是執(zhí)行子進(jìn)程,而不是首先執(zhí)行父進(jìn)程。這種直接在命令行下面向mian()函數(shù)傳遞參數(shù)的方式也是第一次接觸,感觸很深。又例如在2.1.exe中 if (argc 1) / 從第二個(gè)參數(shù)中提取克隆ID
33、: sscanf(argv1 , %d , &nClone) ;執(zhí)行命令:C:Program FilesMicrosoft Visual StudioVC98BinDebug2-1.exe 5Process ID:5140, Clone ID:5最終創(chuàng)建的進(jìn)程號(hào)就從5開始,而不是從0開始了。argc是命令行總的參數(shù)個(gè)數(shù), argv是argc個(gè)參數(shù),其中第0個(gè)參數(shù)是程序的全名,以后的參數(shù)命令行后面跟的用戶輸入的參數(shù)2.6 實(shí)驗(yàn)評(píng)價(jià)(教師)實(shí)驗(yàn)3進(jìn)程的同步與通信Windows 2000線程同步(實(shí)驗(yàn)估計(jì)時(shí)間:100分鐘)3.1 背景知識(shí) Windows 2000 提供的常用對(duì)象可分成三類:核心應(yīng)用
34、服務(wù)、線程同步和線程間通信,其中,開發(fā)人員可以使用線程同步對(duì)象來(lái)協(xié)調(diào)線程和進(jìn)程的工作,以使其共享信息并執(zhí)行任務(wù)。此類對(duì)象包括互鎖數(shù)據(jù)、臨界區(qū)、事件、互斥信號(hào)量等。 多線程編程中關(guān)鍵的一步是保護(hù)所有的共享資源,工具主要有互鎖函數(shù)、臨界區(qū)和互斥信號(hào)量等;另一個(gè)實(shí)質(zhì)性部分是協(xié)調(diào)線程使其完成應(yīng)用程序的任務(wù),為此,可利用內(nèi)核中的事件對(duì)象和信號(hào)。 在進(jìn)程內(nèi)或進(jìn)程間實(shí)現(xiàn)線程同步的最方便的方法是使用事件對(duì)象,這一組內(nèi)核對(duì)象允許一個(gè)線程對(duì)其受信狀態(tài)進(jìn)行直接控制(見表3-1)。表3-1 用于管理事件對(duì)象APIAPI名稱描述CreateEvent()在內(nèi)核中創(chuàng)建一個(gè)新的事件對(duì)象。此函數(shù)允許有安全性設(shè)置、手工還是自動(dòng)
35、重置的標(biāo)志以及初始時(shí)已接收還是未接收信號(hào)狀態(tài)的標(biāo)志。OpenEvent()創(chuàng)建對(duì)已經(jīng)存在的事件對(duì)象的引用。此API函數(shù)需要名稱、繼承標(biāo)志和所需的訪問(wèn)級(jí)別。SetEvent()將手工重置事件轉(zhuǎn)化為已接收信號(hào)狀態(tài)。ResetEvent()將手工重置事件轉(zhuǎn)化為非接收信號(hào)狀態(tài)。PulseEvnt()將自動(dòng)重置事件對(duì)象轉(zhuǎn)化為已接收信號(hào)狀態(tài)。當(dāng)系統(tǒng)釋放所有的等待它的線程時(shí)此種轉(zhuǎn)化立即發(fā)生。 與事件對(duì)象類似,互斥信號(hào)量容易創(chuàng)建、打開、使用并清除。利用CreateMutex()API函數(shù)可創(chuàng)建互斥信號(hào)量,創(chuàng)建時(shí)還可以指定一個(gè)初始的擁有權(quán)標(biāo)志,通過(guò)使用這個(gè)標(biāo)志,只有當(dāng)線程完成了資源的所有的初始化工作時(shí),才允許創(chuàng)
36、建線程釋放互斥信號(hào)量。 為了獲得互斥信號(hào)量,首先,想要訪問(wèn)調(diào)用的線程可使用OpenMutex()API函數(shù)來(lái)獲得指向?qū)ο蟮木浔?;然后,線程將這個(gè)句柄提供給一個(gè)等待函數(shù)。當(dāng)內(nèi)核將互斥信號(hào)量對(duì)象發(fā)送給等待線程時(shí),就表明該線程獲得了互斥信號(hào)量的擁有權(quán)。當(dāng)線程獲得擁有權(quán)時(shí),線程控制了對(duì)共享資源的訪問(wèn)必須設(shè)法盡快地放棄互斥信號(hào)量。放棄共享資源時(shí)需要在該對(duì)象上調(diào)用ReleaseMutex()API。然后系統(tǒng)負(fù)責(zé)將互斥信號(hào)量擁有權(quán)傳遞給下一個(gè)等待著的線程(由到達(dá)時(shí)間決定順序)。3.2 實(shí)驗(yàn)?zāi)康?在本實(shí)驗(yàn)中,通過(guò)對(duì)事件和互斥信號(hào)量對(duì)象的了解,加深對(duì)Windows 2000線程同步的理解。 1)回顧系統(tǒng)進(jìn)程、線
37、程的有關(guān)概念,加深對(duì)Windows 2000的理解。 2)了解事件和互斥信號(hào)量對(duì)象。 3)通過(guò)分析實(shí)驗(yàn)程序,了解管理事件對(duì)象的API。 4)了解在進(jìn)程中如何使用事件對(duì)象。 5)了解在進(jìn)程中如何使用互斥信號(hào)量對(duì)象。 6)了解父進(jìn)程創(chuàng)建子進(jìn)程的程序設(shè)計(jì)方法。3.3 工具/準(zhǔn)備工作 在開始本實(shí)驗(yàn)之前,請(qǐng)回顧教科書的相關(guān)內(nèi)容。 您需要做以下準(zhǔn)備: 1)一臺(tái)運(yùn)行Windows 2000 Professional 操作系統(tǒng)的計(jì)算機(jī)。 2)計(jì)算機(jī)中需安裝Visual C+ 6.0 專業(yè)版或企業(yè)版。3.4 實(shí)驗(yàn)內(nèi)容與步驟 1. 事件對(duì)象 在進(jìn)程間使用事件。父進(jìn)程啟動(dòng)時(shí),利用CreateEvent()API創(chuàng)建
38、一個(gè)命名的、可共享的子進(jìn)程,然后等待子進(jìn)程向事件發(fā)出信號(hào)并終止父進(jìn)程。在創(chuàng)建時(shí),子進(jìn)程通過(guò)OpenEvent()API打開事件對(duì)象,調(diào)用SetEvent()API使其轉(zhuǎn)化為已接收信號(hào)狀態(tài)。兩個(gè)進(jìn)程在發(fā)出信號(hào)之后幾乎立即終止。 步驟1:登錄進(jìn)入Windows 2000 Professional。 步驟2:在“開始”菜單中單擊“程序”、“Microsoft Visual Studio 6.0”“Microsoft Visual C+ 6.0”,進(jìn)入Visual C+窗口。 步驟3:在工具欄單擊“新建”按鈕,編寫代碼保存為3-1.cpp。 程序功能:創(chuàng)建和打開事件對(duì)象在進(jìn)程間傳送信號(hào)。 參考類和函數(shù)
39、:windows.h、iostream、CreateChild()、szFilename、GetModuleFileName、szCmdLine、CloseHandle、WaitForChild()。 步驟4:?jiǎn)螕簟癇uild”菜單中的“Compile 3-1.cpp”命令,單擊“是”按鈕確認(rèn),系統(tǒng)對(duì)3-1.cpp進(jìn)行編譯。 步驟5:編譯完成后,單擊“Build”菜單中的“Build3-1.exe”命令,建立3-1.exe可執(zhí)行文件。 操作能否正常進(jìn)行,如果不行,原因是什么? 解:程序能夠正常執(zhí)行。 步驟6:在工具欄單擊“Execute program”按鈕,執(zhí)行3-1.exe程序。運(yùn)行結(jié)果(
40、分行書寫,如果不成功,原因是什么?):在去掉: Sleep(1500);之前的運(yùn)行結(jié)果是:1. event created2. chlid created3. Parent waiting on child.4. child process begining.5. event signaled6. parent received the envent signaling from child7. Parent released. 去掉: Sleep(1500);語(yǔ)句:1. event created2. chlid created3. Parent waitingc on chhiildl.4
41、. d process begining.5. eparvent erentceived the ensivegnt nsiganlalinge frd6. om child7. Parent released.這個(gè)結(jié)果與你期望的一致嗎?(從進(jìn)程并發(fā)的角度對(duì)結(jié)果進(jìn)行分析)。分析可知:在有Sleep(1500);時(shí),主程序會(huì)等待子程序1.5s,這樣的話子程序先輸出,然后主程序再輸出。這樣的話就不會(huì)出現(xiàn)錯(cuò)誤。而當(dāng)去掉: Sleep(1500);語(yǔ)句之后主程序和字程序同時(shí)輸出就會(huì)出現(xiàn)輸出結(jié)果重疊的情況,變現(xiàn)為輸出結(jié)果錯(cuò)誤。 請(qǐng)回答: 1)程序中,創(chuàng)建一個(gè)事件使用了哪一個(gè)系統(tǒng)函數(shù)?創(chuàng)建時(shí)設(shè)置的初始信號(hào)
42、狀態(tài)是什么? a)創(chuàng)建事件用CreateEvent()函數(shù) b)CreateEvent( NULL,/ 缺省的安全性,子進(jìn)程將具有訪問(wèn)權(quán)限 TRUE,/ 手工重置事件,必須用ResetEvent函數(shù)來(lái)手工將事件的狀態(tài)復(fù)原到無(wú)信號(hào)狀態(tài) FALSE,/ 初始時(shí)是非接受信號(hào)狀態(tài),為TRUE,初始狀態(tài)為有信號(hào)狀態(tài) g_szContinueEvent);/ 事件名稱,指定事件的對(duì)象的名稱,是一個(gè)以0結(jié)束的字符串指針 2)創(chuàng)建一個(gè)進(jìn)程(子進(jìn)程)使用了哪一個(gè)系統(tǒng)函數(shù)? 創(chuàng)建子進(jìn)程使用BOOL CreateProcess( LPCTSTRlpApplicationName, /指向一個(gè)NULL結(jié)尾的、用來(lái)指定
43、可執(zhí)行模塊的字符串。 LPTSTRlpCommandLine, /指向一個(gè)NULL結(jié)尾的、用來(lái)指定要運(yùn)行的命令行。 LPSECURITY_ATTRIBUTESlpProcessAttributes。/指向一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體決定是否返回的句柄可以被子進(jìn)程繼承。 LPSECURITY_ATTRIBUTESlpThreadAttributes, /向一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體決定是否返回的句柄可以被子進(jìn)程繼承 BOOLbInheritHandles, /指示新進(jìn)程是否從調(diào)用進(jìn)程處繼承了句柄。為真表示繼承 DWORDdwCreationFlags,/ 指定附加的、用來(lái)控制優(yōu)先類和進(jìn)程的創(chuàng)建的標(biāo)志。 L
44、PVOIDlpEnvironment, /指向一個(gè)新進(jìn)程的環(huán)境塊。如果此參數(shù)為空,新進(jìn)程使用調(diào)用進(jìn)程的環(huán)境。 LPCTSTRlpCurrentDirectory, /指向一個(gè)以NULL結(jié)尾的字符串,這個(gè)字符串用來(lái)指定子進(jìn)程的工作路徑。如果這個(gè)參數(shù)為空,新進(jìn)程將使用與調(diào)用進(jìn)程相同的驅(qū)動(dòng)器和目錄。 LPSTARTUPINFOlpStartupInfo, /指向一個(gè)用于決定新進(jìn)程的主窗體如何顯示的STARTUPINFO結(jié)構(gòu)體。LPPROCESS_INFORMATIONlpProcessInformation/指向一個(gè)用來(lái)接收新進(jìn)程的識(shí)別信息的結(jié)構(gòu)體。);WIN32API函數(shù)CreateProcess
45、用來(lái)創(chuàng)建一個(gè)新的進(jìn)程和它的主線程,這個(gè)新進(jìn)程運(yùn)行指定的可執(zhí)行文件。 2. 互斥信號(hào)量對(duì)象 使用互斥信號(hào)量來(lái)保證對(duì)兩個(gè)線程間單一數(shù)值的訪問(wèn)。每個(gè)線程都企圖獲得控制權(quán)來(lái)改變?cè)摂?shù)值,然后將該數(shù)值寫入輸出流中。創(chuàng)建者實(shí)際上創(chuàng)建的是互斥信號(hào)量對(duì)象,計(jì)數(shù)方法執(zhí)行等待并釋放,為的是共同使用互斥信號(hào)量所需的資源(因而也就是共享資源)。 步驟1:在工具欄單擊“新建”按鈕,編寫代碼保存為3-2.cpp。 程序功能:利用互斥信號(hào)量保護(hù)共享資源 參考類與函數(shù):windows.h、iostream、class CCountUpDown、 WaitForCompletion()、DoCount()、ReleaseMute
46、x()、 步驟2:?jiǎn)螕簟癇uild”菜單中的“Compile 3-2.cpp”命令,再單擊“是”按鈕確認(rèn),系統(tǒng)對(duì)3-2.cpp進(jìn)行編譯。 步驟3:編譯完成后,單擊“Build”菜單中的“Build 3-2.exe”命令,建立3-2.exe可執(zhí)行文件。 操作能否正常進(jìn)行,如果不行,原因是什么? 解:程序能夠正常執(zhí)行。 步驟4:在工具欄單擊“Execute program”按鈕,執(zhí)行3-2.exe程序。 請(qǐng)描述運(yùn)行結(jié)果(如果運(yùn)行不成功,則可能的原因是什么?):解:程序主要是在互斥信號(hào)量的保證下限制兩個(gè)線程之間對(duì)單一數(shù)值的訪問(wèn)。程序中用的信號(hào)量是m_nAccess,實(shí)現(xiàn)對(duì)m_nValue的遞減。當(dāng)信
47、號(hào)量是1時(shí)實(shí)現(xiàn)第一個(gè)進(jìn)程對(duì)數(shù)據(jù)的訪問(wèn),這時(shí)候進(jìn)程無(wú)法訪問(wèn)數(shù)據(jù),在第一個(gè)進(jìn)程訪問(wèn)結(jié)束之后,釋放信號(hào)量,這樣進(jìn)程2就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問(wèn),而進(jìn)程1則不能繼續(xù)訪問(wèn)。依次循環(huán),程序結(jié)果是:thread:2068value:1access:50thread:2320value:0access:49thread:2068value:1access:48thread:2320value:0access:47thread:2068value:1access:46thread:2320value:0access:45thread:2068value:1access:44thread:2320value:0acc
48、ess:43thread:2068value:1access:42thread:2320value:0access:41thread:2068value:1access:40.thread:2320value:0access:1thread:2068value:1access:03.5 實(shí)驗(yàn)總結(jié)本次實(shí)驗(yàn)主要涉及的操作是線程的同步,例如互斥信號(hào)量容易創(chuàng)建、打開、使用并清除,并利用互斥信號(hào)量保證兩個(gè)進(jìn)程互斥的訪問(wèn)共享數(shù)據(jù)。當(dāng)一個(gè)任務(wù)想對(duì)臨界區(qū)訪問(wèn)時(shí),為了防止別的任務(wù)也對(duì)該臨界區(qū)操作,它需要對(duì)該臨界區(qū)上鎖,這就是互斥信號(hào)量的作用。1)利用CreateMutex()API函數(shù)可創(chuàng)建互斥信號(hào)量,使用Op
49、enMutex()API函數(shù)來(lái)獲得指向?qū)ο蟮木浔?,放棄共享資源時(shí)需要在該對(duì)象上調(diào)用ReleaseMutex()。2)學(xué)習(xí)了用于管理事件對(duì)象的API利用CreateEvent()函數(shù)創(chuàng)建事件,利用OpenEvent函數(shù)實(shí)現(xiàn)對(duì)已經(jīng)創(chuàng)建對(duì)象的訪問(wèn)等。3)在利用信號(hào)量實(shí)現(xiàn)兩個(gè)進(jìn)程之間互斥的訪問(wèn)數(shù)據(jù)的試驗(yàn)之中,用單步調(diào)試實(shí)時(shí)跟蹤信號(hào)量和共享數(shù)據(jù)的狀態(tài)。4)在3-2程序中刪除語(yǔ)句: ReleaseMutex(m_hMutexValue);,即不對(duì)信號(hào)量進(jìn)行釋放,程序的運(yùn)行結(jié)果就會(huì)變?yōu)椋哼@樣就會(huì)變?yōu)橹挥羞M(jìn)程1對(duì)共享的數(shù)據(jù)變量進(jìn)行訪問(wèn)了, 程序2沒(méi)有得到機(jī)會(huì)執(zhí)行。將構(gòu)造函數(shù)中的ReleaseMutex(m_h
50、MutexValue);注釋之后,即運(yùn)行到WaitForSingleObject會(huì)死鎖。程序?qū)⒉荒茉L問(wèn)變量了,程序?qū)⒉粫?huì)有任何的輸出結(jié)果。兩個(gè)釋放信號(hào)量的操作都存在的時(shí)候就能讓兩個(gè)進(jìn)程交替的訪問(wèn)共享變量,程序?qū)?huì)輸出正確的結(jié)果。3.6 實(shí)驗(yàn)評(píng)價(jià)(教師)實(shí)驗(yàn)4進(jìn)程的同步與通信Windows 2000線程間的通信(實(shí)驗(yàn)估計(jì)時(shí)間:100分鐘)4.1 背景知識(shí) Windows 2000 提供的線程間通信類內(nèi)核對(duì)象允許同一進(jìn)程或跨進(jìn)程的線程之間互相發(fā)送信息,包括文件、文件映射、郵件位和命名管道等,其中最常用的是文件和文件映射,這類對(duì)象允許一個(gè)線程很容易地向同一進(jìn)程或其他進(jìn)程中的另一線程發(fā)送信息。 1.
51、文件對(duì)象 文件對(duì)象是人們所熟悉的永久存儲(chǔ)的傳統(tǒng)元素。將一個(gè)文件看作是內(nèi)核對(duì)象可使開發(fā)人員獲得比標(biāo)準(zhǔn)C+文件操作更為強(qiáng)大的功能。 內(nèi)核允許開發(fā)人員在系統(tǒng)設(shè)備或網(wǎng)絡(luò)上創(chuàng)建代表永久存儲(chǔ)數(shù)據(jù)塊的文件對(duì)象。這些文件對(duì)象是對(duì)永久存儲(chǔ)數(shù)據(jù)的低級(jí)訪問(wèn)者;用C+運(yùn)行庫(kù)或其他方法打開的所有文件最終都變成對(duì)CreateFile()API的調(diào)用。 CreateFile()函數(shù)分配一個(gè)內(nèi)核對(duì)象來(lái)代表一個(gè)永久的文件,當(dāng)在磁盤上創(chuàng)建一個(gè)新文件或當(dāng)打開一個(gè)已經(jīng)存在的文件時(shí),就調(diào)用這個(gè)API,其參數(shù)總結(jié)見表4-1表4-1 CreateFile()API參數(shù)參數(shù)名使用目的LPCTSTR lpFileName要打開或創(chuàng)建的文件名。DWORD dwDesiredAccess所要求的文件訪問(wèn)權(quán);一個(gè)包括GENERIC_READ或GENERIC_WRITE的屏蔽。DWORD dwShareMode指定與其他進(jìn)程共享的文件類型(如果有的話)LPSECURITY_ATTRIBUTESlpSecurityAttributes當(dāng)被文件系統(tǒng)支持時(shí)與備份文件對(duì)象有關(guān)的安全性DWORD dwCreationDisposition在文件系統(tǒng)的級(jí)別上所采取的操作的類型。如新文件的創(chuàng)建或打開一個(gè)已有的文件DWORD dwFlagsAndAttributes文件系統(tǒng)的屬性,如只讀、隱藏等
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教師招聘面試技巧解析
- 生態(tài)園區(qū)洗車場(chǎng)租賃合同
- 藝術(shù)品交易合作協(xié)議
- 裝飾工程模板施工合同
- 實(shí)驗(yàn)室保潔人員聘用合同
- 無(wú)人駕駛企業(yè)參觀指南
- 倉(cāng)儲(chǔ)管理員勞動(dòng)合同聘用協(xié)議書
- 科研創(chuàng)新廉潔自律承諾書
- 船舶維修焊絲采購(gòu)招標(biāo)書
- 社區(qū)公園地磚施工合同
- 班級(jí)文化建設(shè)研究課題研究報(bào)告
- 學(xué)而思寒假七年級(jí)尖子班講義第5講二元一次方程組進(jìn)階
- 淺議周記在班務(wù)工作中妙用
- 生物、地理會(huì)考背誦計(jì)劃表
- 國(guó)民經(jīng)濟(jì)統(tǒng)計(jì)學(xué) 第3章中間消耗及投入產(chǎn)出核算
- 課程設(shè)計(jì)(論文)3kta梨果醬車間工藝設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)長(zhǎng)沙辦公樓空調(diào)系統(tǒng)設(shè)計(jì)
- 第三章電阻材料
- 體育科學(xué)研究方法(第三版)第07章實(shí)驗(yàn)法
- 公務(wù)員考試遴選、選調(diào)考試答題卡練字方格(A4紙可直接打印)
- 物理“有效作業(yè)“設(shè)計(jì)與使用研究課題結(jié)題報(bào)告
評(píng)論
0/150
提交評(píng)論