版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
信息學(xué)院操作系統(tǒng)實(shí)驗(yàn)報(bào)告姓名:楊博敏學(xué)號(hào):1305290206專業(yè):軟件工程班級(jí):軟件1302班實(shí)驗(yàn)名稱:進(jìn)程控制與描述
實(shí)驗(yàn)一進(jìn)程控制與描述3.1Windows“任務(wù)管理器”的進(jìn)程管理3.1.1WindowsXP的任務(wù)管理器WindowsXP的任務(wù)管理器提供了用戶計(jì)算機(jī)上正在運(yùn)行的程序和進(jìn)程的相關(guān)信息,也顯示了最常用的度量進(jìn)程性能的單位。使用任務(wù)管理器,可以打開監(jiān)視計(jì)算機(jī)性能的關(guān)鍵指示器,快速查看正在運(yùn)行的程序的狀態(tài),或者終止已停止響應(yīng)的程序。也可以使用多個(gè)參數(shù)評(píng)估正在運(yùn)行的進(jìn)程的活動(dòng),以及查看CPU和內(nèi)存使用情況的圖形和數(shù)據(jù)。其中:1)“應(yīng)用程序”選項(xiàng)卡顯示正在運(yùn)行程序的狀態(tài),用戶能夠結(jié)束、切換或者啟動(dòng)程序。2)“進(jìn)程”選項(xiàng)卡顯示正在運(yùn)行的進(jìn)程信息。例如,可以顯示關(guān)于CPU和內(nèi)存使用情況、頁(yè)面錯(cuò)誤、句柄計(jì)數(shù)以及許多其他參數(shù)的信息。3)“性能”選項(xiàng)卡顯示計(jì)算機(jī)動(dòng)態(tài)性能,包括CPU和內(nèi)存使用情況的圖表,正在運(yùn)行的句柄、線程和進(jìn)程的總數(shù),\o"查看定義"物理、\o"查看定義"核心和\o"查看定義"認(rèn)可的內(nèi)存總數(shù)(KB)等。3.1.2練習(xí)與實(shí)驗(yàn)在本節(jié)“練習(xí)與實(shí)驗(yàn)”中,通過在Windows任務(wù)管理器中對(duì)程序進(jìn)程進(jìn)行響應(yīng)的管理操作,熟悉操作系統(tǒng)進(jìn)程管理的概念,學(xué)習(xí)觀察操作系統(tǒng)運(yùn)行的動(dòng)態(tài)性能。1.工具/準(zhǔn)備工作在開始本實(shí)驗(yàn)之前,請(qǐng)回顧教科書的相關(guān)內(nèi)容。需要準(zhǔn)備一臺(tái)運(yùn)行WindowsXPProfessional操作系統(tǒng)的計(jì)算機(jī)。2.實(shí)驗(yàn)內(nèi)容與步驟啟動(dòng)并進(jìn)入Windows環(huán)境,單擊Ctrl+Alt+Del鍵,或者右鍵單擊任務(wù)欄,在快捷菜單中單擊“任務(wù)管理器”命令,打開“任務(wù)管理器”窗口。在本次實(shí)驗(yàn)中,你使用的操作系統(tǒng)版本是:_____windowsXP_______________________________________________當(dāng)前機(jī)器中由你打開,正在運(yùn)行的應(yīng)用程序有:1)Microsoft_WordWindows“任務(wù)管理器”的窗口由4個(gè)選項(xiàng)卡組成,分別是:1)應(yīng)用程序2)進(jìn)程3)性能4)用戶當(dāng)前“進(jìn)程”選項(xiàng)卡顯示的欄目分別是(可移動(dòng)窗口下方的游標(biāo)/箭頭,或使窗口最大化進(jìn)行觀察):1)映像名稱2)用戶名3)CPU4)內(nèi)存使用(1)使用任務(wù)管理器終止進(jìn)程步驟1:?jiǎn)螕簟斑M(jìn)程”選項(xiàng)卡,一共顯示了__48個(gè)進(jìn)程。請(qǐng)?jiān)囍鴧^(qū)分一下,其中:系統(tǒng)(SYSTEM)進(jìn)程有___23___個(gè),填入表3.1中。表3.1實(shí)驗(yàn)記錄映像名稱用戶名CPU內(nèi)存使用Jqs.exeSYSTEM1.4MSqlserver.exeSYSTEM3.8MMsmdsrv.exeSYSTEM6.3MSvchost.exeSYSTEM4.4M注:在Windows2000中,“用戶名”需要自己判斷。這一點(diǎn),在WindowsXP中有了改進(jìn)。服務(wù)(SERVICE)進(jìn)程有_5_個(gè),填入表3.2中。表3.2實(shí)驗(yàn)記錄映像名稱用戶名CPU內(nèi)存使用Svchost.exeLOCALSERVICE4.6Malg.exeLOCALSERVICE3.7MSvchost.exeNETWORKSERVICE4.5MSvchost.exeNETWORKSERVICE3.2MSqlservr.exeNETWORKSERVICE3.7M用戶進(jìn)程有__1__個(gè),填入表3.3中。表3.3實(shí)驗(yàn)記錄映像名稱用戶名CPU內(nèi)存使用MicrosoftOfficeWordSYSTEM0.5%20.2M提示:在WindowsXP的“任務(wù)管理器”中,“進(jìn)程”選項(xiàng)卡增加了一個(gè)“用戶名”欄目,其中區(qū)分了SYSTEM、NETWORKSERVICE、LOCALSERVICE和用戶的不同進(jìn)程類別。步驟2:?jiǎn)螕粢K止的進(jìn)程,然后單擊“結(jié)束進(jìn)程”按鈕。注意:終止進(jìn)程時(shí)要小心。終止進(jìn)程有可能導(dǎo)致不希望發(fā)生的結(jié)果,包括數(shù)據(jù)丟失和系統(tǒng)不穩(wěn)定等。因?yàn)樵诒唤K止前,進(jìn)程將沒有機(jī)會(huì)保存其狀態(tài)和數(shù)據(jù)。如果結(jié)束應(yīng)用程序,您將丟失未保存的數(shù)據(jù)。如果結(jié)束系統(tǒng)服務(wù),系統(tǒng)的某些部分可能無法正常工作。終止進(jìn)程,將結(jié)束它直接或間接創(chuàng)建的所有子進(jìn)程。請(qǐng)將終止某進(jìn)程后的操作結(jié)果與原記錄數(shù)據(jù)對(duì)比,發(fā)生了什么:___cpu占用率變低,內(nèi)存占用率變低(2)顯示其他進(jìn)程記數(shù)器在“進(jìn)程”選項(xiàng)卡上單擊“查看”菜單,然后單擊“選擇列”命令。單擊要增加顯示為列標(biāo)題的項(xiàng)目,然后單擊“確定”。為對(duì)進(jìn)程列表進(jìn)行排序,可在“進(jìn)程”選項(xiàng)卡上單擊要根據(jù)其進(jìn)行排序的列標(biāo)題。而為了要反轉(zhuǎn)排序順序,可再次單擊列標(biāo)題。請(qǐng)記錄:經(jīng)過調(diào)整,“進(jìn)程”選項(xiàng)卡現(xiàn)在顯示的項(xiàng)目分別是:____________________________________________________________________________________________________________________________________________________________________________________________________________________通過對(duì)“查看”菜單的選擇操作,可以在“任務(wù)管理器”中更改顯示選項(xiàng):·在“應(yīng)用程序”選項(xiàng)卡上,可以按詳細(xì)信息、大圖標(biāo)或小圖標(biāo)查看?!ぴ凇靶阅堋边x項(xiàng)卡上,可以更改CPU記錄圖,并顯示內(nèi)核時(shí)間?!帮@示內(nèi)核時(shí)間”選項(xiàng)在“CPU使用”和“CPU使用記錄”圖表上添加紅線。紅線指示內(nèi)核操作占用的CPU資源數(shù)量。(3)更改正在運(yùn)行的程序的優(yōu)先級(jí)要查看正在運(yùn)行的程序的優(yōu)先級(jí),可單擊“進(jìn)程”選項(xiàng)卡,單擊“查看”菜單,單擊“選擇列”>“基本優(yōu)先級(jí)”命令,然后單擊“確定”。為更改正在運(yùn)行的程序的優(yōu)先級(jí),可在“進(jìn)程”選項(xiàng)卡上右鍵單擊您要更改的程序,指向“設(shè)置優(yōu)先級(jí)”,然后單擊所需的選項(xiàng)。更改進(jìn)程的優(yōu)先級(jí)可以使其運(yùn)行更快或更慢(取決于是提升還是降低了優(yōu)先級(jí)),但也可能對(duì)其他進(jìn)程的性能有相反的影響。請(qǐng)記錄:操作完成后你的體會(huì)是:每個(gè)進(jìn)程都是有多個(gè)線程組成的,進(jìn)程終止,線程隨之終止,釋放內(nèi)存;多處理器計(jì)算機(jī)上,用戶還可以給處理器指派進(jìn)程,將程序或進(jìn)程的執(zhí)行限制在選定的處理器上,但這有可能導(dǎo)致總體性能的下降。3.實(shí)驗(yàn)總結(jié)程序以進(jìn)程的方式在計(jì)算機(jī)內(nèi)運(yùn)行,各個(gè)進(jìn)程都會(huì)占用cpu,但每個(gè)進(jìn)程不會(huì)一直霸占著cpu,而是每個(gè)進(jìn)程會(huì)分配很短的時(shí)間給cpu,當(dāng)時(shí)間一到cpu會(huì)執(zhí)行下一個(gè)進(jìn)程,因此計(jì)算機(jī)給我們的感覺是多個(gè)程序同時(shí)執(zhí)行,其實(shí)不然4.實(shí)驗(yàn)評(píng)價(jià)(教師)____________________________________________________________________________________________________________________________________________3.1.3閱讀與思考:手機(jī)操作系統(tǒng)介紹(之一)1.WindowsMobile系列手機(jī)操作系統(tǒng)WindowsMobile系列操作系統(tǒng)是在微軟計(jì)算機(jī)的Windows操作系統(tǒng)上變化而來的,因此,它們的操作界面非常相似,熟悉計(jì)算機(jī)Windows系列操作系統(tǒng)的朋友一看到WindowsMobile系列的操作系統(tǒng)就一般會(huì)認(rèn)得它是出于微軟之手。WindowsMobile系列操作系統(tǒng)具有功能更強(qiáng)大,多數(shù)具備了音頻、視頻文件播放、上網(wǎng)沖浪、MSN聊天、電子郵件收發(fā)等功能。而且,支持該操作系統(tǒng)的智能手機(jī)多數(shù)都采用了英特爾嵌入式處理器,主頻比較高,另外,采用該操作系統(tǒng)的智能手機(jī)在其它硬件配置(如內(nèi)存、儲(chǔ)存卡容量等)上也較采用其它操作系統(tǒng)的智能手機(jī)要高出許多,因此性能比較強(qiáng)勁,操作起來速度會(huì)比較快。但是,此系列手機(jī)也有一定的缺點(diǎn),如因配置高、功能多而產(chǎn)生耗電量大、電池續(xù)航時(shí)間短、硬件采用成本高等缺點(diǎn)。WindowsMobile系列操作系統(tǒng)包括SmartPhone以及PocketPCPhone兩種平臺(tái)。PocketPCphone主要用于掌上電腦型的智能手機(jī),而SmartPhone則主要為單手智能手機(jī)提供操作系統(tǒng)。(1)SmartPhone操作系統(tǒng)MicrosoftSmartphone是微軟基于MicrosoftWindowsCE內(nèi)核開發(fā)的、為智能手機(jī)提供的一種操作系統(tǒng),與使用手寫筆來進(jìn)行操作的智能手機(jī)不同的是,基于該操作系統(tǒng)的手機(jī)無需借助手寫筆,只需用手機(jī)提供的鍵盤就能完成幾乎所有的操作,因此,使用該操作系統(tǒng)的手機(jī)用戶只需一只手操作即可。基于Smartphone操作系統(tǒng)的智能手機(jī)與其它微軟操作系統(tǒng)的智能手機(jī)在功能上并沒有很大區(qū)別,多數(shù)具有MP3播放、MSN聊天、電子郵件收發(fā)等功能,無需借助手寫筆來進(jìn)行操作,攜帶方便。目前支持該操作系統(tǒng)的智能手機(jī)有神達(dá)Mio8390和多普達(dá)565等.(2)PocketPCPhone操作系統(tǒng)PocketPCPhone是最為常見的微軟智能手機(jī)操作系統(tǒng),目前市面上絕大多數(shù)基于微軟操作系統(tǒng)的智能手機(jī)都采用了這一操作系統(tǒng),例如聯(lián)想ET180、ET560、多普達(dá)696、大顯CU928、多普達(dá)等智能手機(jī)。與微軟Smartphone不同的是,該操作系統(tǒng)主要借助手寫筆來完成大部分的操作。2.Symbian開放式操作系統(tǒng)Symbian操作系統(tǒng)提供了靈活的應(yīng)用界面(UI)框架,不但使開發(fā)者得以快速掌握必要的技術(shù),同時(shí)還使手機(jī)制造商能夠推出不同界面的產(chǎn)品。Symbian系統(tǒng)手機(jī)可以采用多種應(yīng)用界面形式:一類在設(shè)計(jì)上很類似當(dāng)前最常見的手機(jī),即主要通過鍵盤進(jìn)行輸入的手機(jī);另一類是使用手寫筆進(jìn)行操作;還有一類是既有鍵盤又有觸摸屏的手機(jī),它具有較大的屏幕和較小的鍵盤。不同的輸入方式和外觀設(shè)計(jì)會(huì)對(duì)各款手機(jī)的主要用途產(chǎn)生很大的影響。應(yīng)用界面在要求上是由手機(jī)和市場(chǎng)決定的。有了Symbian操作系統(tǒng),手機(jī)制造商和第三方開發(fā)者就可以為上述各類手機(jī)開發(fā)出獨(dú)具特色的應(yīng)用界面,例如:(1)采用數(shù)字鍵盤的手機(jī)(Symbians60)此類手機(jī)需要靈活的應(yīng)用界面,方便用戶使用導(dǎo)航鍵(Joystick)、軟按鍵或轉(zhuǎn)點(diǎn)通鍵(Jogdial)操作,諾基亞3650和N-Gage也就是代表他們采用了Series60應(yīng)用界面。如諾基亞6600;諾基亞7610;諾基亞6670等。(2)采用觸摸式屏幕的手機(jī)(SymbianUIQ)這類手機(jī)主要采用了UIQ界面,其中以索尼愛立信P802、P908為代表。UIQ是一種可定制的基于手寫筆輸入的應(yīng)用界面,很適合支持具有豐富多媒體功能的手機(jī)。(3)采用完整鍵盤和超大彩色屏幕的手機(jī)(Symbians80)此類手機(jī)為那些需要在辦公室以外編輯信息和查看業(yè)務(wù)數(shù)據(jù)的用戶提供了先進(jìn)的移動(dòng)通信功能。諾基亞9300—9500個(gè)人通訊器系列是此類應(yīng)用界面的典型代表。 (待續(xù))資料來源:中國(guó)軟件網(wǎng)(/tech/6/67348.html)3.2WindowsXP編程3.2.1WindowsXP編程初步WindowsXP可以識(shí)別的應(yīng)用程序包括控制臺(tái)應(yīng)用程序、GUI應(yīng)用程序和服務(wù)應(yīng)用程序??刂婆_(tái)應(yīng)用程序可以創(chuàng)建GUI,GUI應(yīng)用程序可以作為服務(wù)來運(yùn)行,服務(wù)也可以向標(biāo)準(zhǔn)的輸出流寫入數(shù)據(jù)。不同類型應(yīng)用程序間的惟一重要區(qū)別是其啟動(dòng)方法。WindowsXP是以NT的技術(shù)構(gòu)建的,它提供了創(chuàng)建控制臺(tái)應(yīng)用程序的能力,使用戶可以利用標(biāo)準(zhǔn)的C++工具,如iostream庫(kù)中的cout和cin對(duì)象,來創(chuàng)建小型應(yīng)用程序。當(dāng)系統(tǒng)運(yùn)行時(shí),WindowsXP的服務(wù)通常要向系統(tǒng)用戶提供所需功能。服務(wù)應(yīng)用程序類型需要ServiceMail()函數(shù),由服務(wù)控制管理器(SCM)加以調(diào)用。SCM是操作系統(tǒng)的集成部分,負(fù)責(zé)響應(yīng)系統(tǒng)啟動(dòng)以開始服務(wù)、指導(dǎo)用戶控制或從另一個(gè)服務(wù)中來的請(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()、ServiceMain()或WinMain()函數(shù)的低級(jí)入口點(diǎn)。機(jī)器代碼中包括有控制邏輯,它所做的事包括跳轉(zhuǎn)到WindowsAPI函數(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ù)。3.2.2練習(xí)與實(shí)驗(yàn)在本節(jié)“練習(xí)與實(shí)驗(yàn)”中,通過對(duì)WindowsXP編程,進(jìn)一步熟悉操作系統(tǒng)的基本概念,較好地理解WindowsXP的結(jié)構(gòu)。1.工具/準(zhǔn)備工作在開始本實(shí)驗(yàn)之前,請(qǐng)回顧教科書的相關(guān)內(nèi)容。需要準(zhǔn)備一臺(tái)運(yùn)行WindowsXPProfessional操作系統(tǒng)的計(jì)算機(jī),且該計(jì)算機(jī)中需安裝VisualC++6.0專業(yè)版或企業(yè)版。提示:安裝VisualC++時(shí),請(qǐng)注意選擇“系統(tǒng)變量”復(fù)選框,否則會(huì)影響到下面CL命令的使用。2.實(shí)驗(yàn)內(nèi)容與步驟(1)簡(jiǎn)單的控制臺(tái)應(yīng)用程序我們先來創(chuàng)建一個(gè)名為“Hello”的應(yīng)用程序。步驟1:登錄進(jìn)入WindowsXPProfessional。步驟2:在“開始”>“所有程序”>“附件”菜單中單擊“記事本”命令,將清單3-l中的程序鍵入記事本中,并把代碼保存為Hello.cpp。清單3-1一個(gè)簡(jiǎn)單的WindowsXP控制臺(tái)應(yīng)用程序//hello項(xiàng)目#include<iostream>voidmain(){std::cout<<“Hello,WindowsXP”<<std::endl;}步驟3:在“開始”>“所有程序”>“附件”菜單中單擊“命令提示符”命令,進(jìn)入Windows“命令提示符”窗口,并利用簡(jiǎn)單的標(biāo)準(zhǔn)命令行:C:\>CLHello.cpp來創(chuàng)建可執(zhí)行的Hello.EXE。請(qǐng)記錄:操作能否正常進(jìn)行?如果不行,則可能的原因是什么?___能步驟4:運(yùn)行Hello.EXE程序。請(qǐng)記錄:運(yùn)行結(jié)果(如果運(yùn)行不成功,則可能的原因是什么?):_(2)GUI應(yīng)用程序在下面的實(shí)驗(yàn)中,C++編譯器創(chuàng)建一個(gè)GUI應(yīng)用程序,代碼中包括了WinMain()方法,這是GUI類型的應(yīng)用程序的標(biāo)準(zhǔn)入口點(diǎn)。步驟1:在“開始”>“所有程序”>“附件”菜單中單擊“記事本”命令,將清單3-2中的程序鍵入記事本中,并把代碼保存為3-2.cpp。提示:在本書相關(guān)的實(shí)驗(yàn)素材可以從科學(xué)出版社網(wǎng)站()的下載區(qū)下載。其中包含了在各個(gè)實(shí)驗(yàn)中用到的所有程序的源代碼,這些源程序均通過調(diào)試運(yùn)行,實(shí)驗(yàn)時(shí)可直接將文件輸入。希望這有助于提高實(shí)驗(yàn)的效率。清單3-2WindowsXP的GUI應(yīng)用程序//msgbox項(xiàng)目#include<windows.h> //標(biāo)準(zhǔn)的include//告訴連接器與包括MessageBoxAPI函數(shù)的user32庫(kù)進(jìn)行連接#pragmacomment(lib,“user32.lib”)//這是一個(gè)可以彈出信息框然后退出的筒單的應(yīng)用程序intAPIENTRYWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){::MessageBox(NULL, //沒有父窗口“Hello,Windows2000”, //消息框中的文本“Greetings”, //消息框標(biāo)題MB_OK); //其中只有一個(gè)OK按鈕//返回0以便通知系統(tǒng)不進(jìn)入消息循環(huán)return(0);}也可以利用任何其他文本編輯器鍵入程序代碼,如果這樣,例如使用WORD來鍵入和編輯程序,則應(yīng)該注意什么問題?___注意中文字符;步驟2:在“命令提示符”窗口運(yùn)行CL.EXE,產(chǎn)生3-2.EXE文件:C:\>CL3-2.cpp在清單3-2的GUI應(yīng)用程序中,首先需要Windows.h頭文件,以便獲得傳送給WinMain()和MessageBox()API函數(shù)的數(shù)據(jù)類型定義。接著的pragma指令指示編譯器/連接器找到User32.LIB庫(kù)文件并將其與產(chǎn)生的EXE文件連接起來。這樣就可以運(yùn)行簡(jiǎn)單的命令行命令CL3-2.CPP來創(chuàng)建這一應(yīng)用程序,如果沒有pragma指令,則MessageBox()API函數(shù)就成為未定義的了。這一指令是VisualStudioC++編譯器特有的。接下來是WinMain()方法。其中有四個(gè)由實(shí)際的低級(jí)入口點(diǎn)傳遞來的參數(shù)。hInstance參數(shù)用來裝入與代碼相連的圖標(biāo)或位圖一類的資源,無論何時(shí),都可用GetModuleHandle()API函數(shù)將這些資源提取出來。系統(tǒng)利用實(shí)例句柄來指明代碼和初始的數(shù)據(jù)裝在內(nèi)存的何處。句柄的數(shù)值實(shí)際上是EXE文件映像的基地址,通常為0x00400000。下一個(gè)參數(shù)hPrevInstance是為向后兼容而設(shè)的,現(xiàn)在系統(tǒng)將其設(shè)為NULL。應(yīng)用程序的命令行(不包括程序的名稱)是lpCmdLine參數(shù)。另外,系統(tǒng)利用nCmdShow參數(shù)告訴應(yīng)用程序如何顯示它的主窗口(選項(xiàng)包括最小化、最大化和正常)。最后,程序調(diào)用MessageBox()API函數(shù)并退出。如果在進(jìn)入消息循環(huán)之前就結(jié)束運(yùn)行的話,最后必須返回0。請(qǐng)記錄:運(yùn)行結(jié)果(試將其中的信息與清單3-1程序的運(yùn)行結(jié)果進(jìn)行比較):_________________________________________(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)用。在系統(tǒng)中運(yùn)行的任何進(jìn)程都可調(diào)用GetCurrentProcess()API函數(shù),此函數(shù)可返回標(biāo)識(shí)進(jìn)程本身的句柄。然后就可在Windows需要該進(jìn)程的有關(guān)情況時(shí),利用這一句柄來提供。步驟1:將清單3-3.cpp程序鍵入記事本中,并把代碼保存為3-3.cpp。清單3-3獲得和使用進(jìn)程的句柄清單3-4利用句柄查出進(jìn)程的詳細(xì)信息//proclist項(xiàng)目#include<windows.h>#include<tlhelp32.h>#include<iostream>//當(dāng)在用戶模式和內(nèi)核模式下都提供所耗時(shí)間時(shí),在內(nèi)核模式下進(jìn)行所耗時(shí)間的64位計(jì)算的幫助方法DWORDGetKernelModePercentage(constFILETIME&ftKernel,constFILETIME&ftUser){//將FILETIME結(jié)構(gòu)轉(zhuǎn)化為64位整數(shù)ULONGLONGqwKernel=(((ULONGLONG)ftKernel.dwHighDateTime)<<32)+ftKernel.dwLowDateTime;ULONGLONGqwUser=(((ULONGLONG)ftUser.dwHighDateTime)<<32)+ftUser.dwLowDateTime;//將消耗時(shí)間相加,然后計(jì)算消耗在內(nèi)核模式下的時(shí)間百分比ULONGLONGqwTotal=qwKernel+qwUser;DWORDdwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal);return(dwPct);}//以下是將當(dāng)前運(yùn)行進(jìn)程名和消耗在內(nèi)核模式下的時(shí)間百分?jǐn)?shù)都顯示出來的應(yīng)用程序voidmain(){//對(duì)當(dāng)前系統(tǒng)中運(yùn)行的進(jìn)程拍取“快照”HANDLEhSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, //提取當(dāng)前進(jìn)程0); //如果是當(dāng)前進(jìn)程,就將其忽略//初始化進(jìn)程入口PROCESSENTRY32pe;::ZeroMemory(&pe,sizeof(pe));pe.dwSize=sizeof(pe);//按所有進(jìn)程循環(huán)BOOLbMore=::Process32First(hSnapshot,&pe);while(bMore){//打開用于讀取的進(jìn)程HANDLEhProcess=::OpenProcess(PROCESS_QUERY_INFORMATION, //指明要得到信息FALSE, //不必繼承這一句柄pe.th32ProcessID); //要打開的進(jìn)程if(hProcess!=NULL){//找出進(jìn)程的時(shí)間FILETIMEftCreation,ftExit,ftKernelMode,ftUserMode;::GetProcessTimes(hProcess, //所感興趣的進(jìn)程&ftCreation, //進(jìn)程的啟動(dòng)時(shí)間(絕對(duì)的)&ftExit, //結(jié)束時(shí)間(如果有的話)&ftKernelMode, //在內(nèi)核模式下消耗的時(shí)間&ftUserMode); //在用戶模式下消耗的時(shí)間//計(jì)算內(nèi)核模式消耗的時(shí)間百分比DWORDdwPctKernel=::GetKernelModePercentage(ftKernelMode, //在內(nèi)核模式上消耗的時(shí)間ftUserMode); //在用戶模式下消耗的時(shí)間//向用戶顯示進(jìn)程的某些信息std::cout<<“ProcessID:”<<pe.th32ProcessID<<“,EXEfile:”<<pe.szExeFile<<“,%inkernelmode:”<<dwPctKernel<<std::endl;//消除句柄::CloseHandle(hProcess);}//轉(zhuǎn)向下一個(gè)進(jìn)程bMore=::Process32Next(hSnapshot,&pe);}}清單3-4程序首先利用WindowsXP的新特性,即工具幫助庫(kù)來獲得當(dāng)前運(yùn)行的所有進(jìn)程的快照。然后應(yīng)用程序進(jìn)入快照中的每一個(gè)進(jìn)程,得到其以PROCESSENTRY32結(jié)構(gòu)表示的屬性。這一結(jié)構(gòu)用來向OpenProcess()API函數(shù)提供進(jìn)程的ID。Windows跟蹤每一進(jìn)程的有關(guān)時(shí)間,示例中是通過打開的進(jìn)程句柄和GetProcessTimes()API來直詢得到有關(guān)時(shí)間的。接下來,一個(gè)定制的幫助函數(shù)取得了幾個(gè)返回的數(shù)值,然后計(jì)算進(jìn)程在內(nèi)核模式下消耗的時(shí)間占總時(shí)間的百分比。程序的其余部分比較簡(jiǎn)單,只是將有關(guān)信息顯示給用戶,清除進(jìn)程句柄,然后繼續(xù)循環(huán),直到所有進(jìn)程都計(jì)算過為止。步驟10:在“命令提示符”窗口運(yùn)行CL.EXE,產(chǎn)生3-4.EXE文件:C:\>CL3-4.cpp請(qǐng)記錄:運(yùn)行結(jié)果:3.實(shí)驗(yàn)總結(jié)通過使用Windows命令窗口,學(xué)會(huì)了基本語(yǔ)句的執(zhí)行、編譯,以及如何尋找進(jìn)程id,打印提示框等。4.實(shí)驗(yàn)評(píng)價(jià)(教師)____________________________________________________________________________________________________________________________________________3.2.3閱讀與思考:手機(jī)操作系統(tǒng)(續(xù)前)3.PALM手機(jī)操作系統(tǒng)PALM是3Com公司的PalmComputing部開發(fā)的一種32位的嵌入式操作系統(tǒng),原本是一家生產(chǎn)掌上電腦及掌上電腦操作系統(tǒng)為主的公司,PALM智能手機(jī)所用的PALM操作系統(tǒng)又與PALM掌上電腦所用的操作系統(tǒng)非常相似,因此,基于該操作系統(tǒng)的手機(jī)擁有的第三方軟件較多,以前用慣了PALM掌上電腦的用戶能非??焖俚卣莆者@類的智能手機(jī)。由于PALM一直遵循LessisMore(少就是多)這一理念去設(shè)計(jì),所以,與微軟所推出操作系統(tǒng)要占有大量的系統(tǒng)資源和儲(chǔ)存容量不同的是,它本身所占的內(nèi)存極小,基于PALM操作系統(tǒng)編寫的應(yīng)用程序所占的空間也很小,通常只有幾十KB,所以基于PALM操作系統(tǒng)的掌上電腦雖然只有幾兆內(nèi)存卻可以運(yùn)行眾多的應(yīng)用程序。但是,這么一來,它的功能就沒那么多,當(dāng)然,最近PALM似乎也意識(shí)到豐富的功能對(duì)消費(fèi)者的吸引力之大,因此,PALM也似乎越來越向提供豐富的功能靠攏,“少就是多”的設(shè)計(jì)理念逐步削弱。另外,對(duì)于中國(guó)用戶而言,它有一個(gè)不足之處是,它的操作系統(tǒng)起初在中國(guó)銷售的產(chǎn)品仍然要使用中文外掛平臺(tái),有相當(dāng)部分依然是以英文界面為主,在一定程度上影響了基于PALM操作系統(tǒng)的產(chǎn)品在中國(guó)市場(chǎng)的大面積進(jìn)入。目前,基于PALM操作系統(tǒng)的手機(jī)有三星SPH-i330、HandspringTreo650系列等。4.Linux手機(jī)操作系統(tǒng)與WindowsMobile系列操作系統(tǒng)一樣,Linux手機(jī)操作系統(tǒng)是由計(jì)算機(jī)Linux操作系統(tǒng)“變化”而來的。簡(jiǎn)單地說,Linux是一套免費(fèi)使用和自由傳播的操作系統(tǒng)。它支持32位和64位處理器,在計(jì)算機(jī)領(lǐng)域中,主要用于配備Intelx86系列CPU的計(jì)算機(jī),在手機(jī)領(lǐng)域中,較具代表性的產(chǎn)品有摩托羅拉A768。Linux具有穩(wěn)定、可靠、安全等優(yōu)點(diǎn),有強(qiáng)大的網(wǎng)絡(luò)功能。在相關(guān)軟件的支持下,可實(shí)現(xiàn)WWW、FTP、DNS、DHCP、E-mail等服務(wù)。由于Linux具有源代碼開放、這一特點(diǎn)非常重要,因?yàn)樨S富的應(yīng)用是智能手機(jī)的優(yōu)越性體現(xiàn)和關(guān)鍵賣點(diǎn)所在。從應(yīng)用開發(fā)的角度看,由于Linux的源代碼是開放的,有利于獨(dú)立軟件開發(fā)商(ISV)開發(fā)出硬件利用效率高、功能更強(qiáng)大的應(yīng)用軟件,也方便行業(yè)用戶開發(fā)自己的安全、可控認(rèn)證系統(tǒng)。特別是當(dāng)智能手機(jī)大量用作行業(yè)應(yīng)用的移動(dòng)終端時(shí),Linux在手機(jī)操作系統(tǒng)市場(chǎng)中也異軍突起,成為一股不容忽視的力量。目前,基于Linux手機(jī)操作系統(tǒng)的產(chǎn)品有三星mitssch-i519和摩托羅拉A768、A780、e680等。資料來源:中國(guó)軟件網(wǎng)(/tech/6/67348.html)請(qǐng)分析:閱讀以上文章,你能得到什么啟發(fā)?請(qǐng)簡(jiǎn)述之。手機(jī)市場(chǎng)更新迅速,手機(jī)種類繁多,手機(jī)應(yīng)用更新快,Linux更能為大眾所接受。3.3WindowsXP進(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()函數(shù)。對(duì)于C++運(yùn)行庫(kù)來說,這一調(diào)用發(fā)生在應(yīng)用程序的main()函數(shù)返回之后。3.3.1創(chuàng)建進(jìn)程CreateProcess()調(diào)用的核心參數(shù)是可執(zhí)行文件運(yùn)行時(shí)的文件名及其命令行。表3.4詳細(xì)地列出了每個(gè)參數(shù)的類型和名稱。表3.4CreateProcess()函數(shù)的參數(shù)參數(shù)名稱使用目的LPCTSTRlpApplivationName全部或部分地指明包括可執(zhí)行代碼的EXE文件的文件名LPCTSTRlpCommandLine向可執(zhí)行文件發(fā)送的參數(shù)LPSECURIITY_ATTRIBUTESlpProcessAttributes返回進(jìn)程句柄的安全屬性。主要指明這一句柄是否應(yīng)該由其他子進(jìn)程所繼承LPSECURIITY_ATTRIBUTESlpThreadAttributes返回進(jìn)程的主線程的句柄的安全屬性BOOLbInheritHandle一種標(biāo)志,告訴系統(tǒng)允許新進(jìn)程繼承創(chuàng)建者進(jìn)程的句柄DWORDdwCreationFlage特殊的創(chuàng)建標(biāo)志(如CREATE_SUSPENDED)的位標(biāo)記LPVOIDlpEnvironment向新進(jìn)程發(fā)送的一套環(huán)境變量;如為null值則發(fā)送調(diào)用者環(huán)境LPCTSTRlpCurrentDirectory新進(jìn)程的啟動(dòng)目錄STARTUPINFOlpStartupInfoSTARTUPINFO結(jié)構(gòu),包括新進(jìn)程的輸入和輸出配置的詳情L(zhǎng)PPROCESS_INFORMATIONlpProcessInformation調(diào)用的結(jié)果塊;發(fā)送新應(yīng)用程序的進(jìn)程和主線程的句柄和ID可以指定第一個(gè)參數(shù),即應(yīng)用程序的名稱,其中包括相對(duì)于當(dāng)前進(jìn)程的當(dāng)前目錄的全路徑或者利用搜索方法找到的路徑;lpCommandLine參數(shù)允許調(diào)用者向新應(yīng)用程序發(fā)送數(shù)據(jù);接下來的三個(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來啟動(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ì)于系統(tǒng)中所有其他的活動(dòng)進(jìn)程來說,給此進(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)用CloseHandle()API函數(shù)是重要的,因?yàn)槿绻粚⑦@些句柄關(guān)閉的話,有可能危及主創(chuàng)進(jìn)程終止之前的任何未釋放的資源。3.3.2正在運(yùn)行的進(jìn)程如果一個(gè)進(jìn)程擁有至少一個(gè)執(zhí)行線程,則為正在系統(tǒng)中運(yùn)行的進(jìn)程。通常,這種進(jìn)程使用主線程來指示它的存在。當(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ù)來查看,與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()和GetCommandLine(),可以給出用在CreateProcess()中的參數(shù)以啟動(dòng)應(yīng)用程序。在創(chuàng)建應(yīng)用程序時(shí)可使用的另一個(gè)API函數(shù)是IsDebuggerPresent()??衫肁PI函數(shù)GetGuiResources()來查看進(jìn)程的GUI資源。此函數(shù)既可返回指定進(jìn)程中的打開的GUI對(duì)象的數(shù)目,也可返回指定進(jìn)程中打開的USER對(duì)象的數(shù)目。進(jìn)程的其他性能信息可通過GetProcessIoCounters()、GetProcessPriorityBoost()、GetProcessTimes()和GetProcessWorkingSetSize()API得到。以上這幾個(gè)API函數(shù)都只需要具有PROCESS_QUERY_INFORMATION訪問權(quán)限的指向所感興趣進(jìn)程的句柄。另一個(gè)可用于進(jìn)程信息查詢的API函數(shù)是GetProcessVersion()。此函數(shù)只需感興趣進(jìn)程的PID(進(jìn)程標(biāo)識(shí)號(hào))。本實(shí)驗(yàn)的程序清單3-6中列出了這一API函數(shù)與GetVersionEx()的共同作用,可確定運(yùn)行進(jìn)程的系統(tǒng)的版本號(hào)。3.3.3終止進(jìn)程所有進(jìn)程都是以調(diào)用ExitProcess()或者TerminateProcess()函數(shù)結(jié)束的。但最好使用前者而不要使用后者,因?yàn)檫M(jìn)程是在完成了它的所有的關(guān)閉“職責(zé)”之后以正常的終止方式來調(diào)用前者的。而外部進(jìn)程通常調(diào)用后者即突然終止進(jìn)程的進(jìn)行,由于關(guān)閉時(shí)的途徑不太正常,有可能引起錯(cuò)誤的行為。TerminateProcess()API函數(shù)只要打開帶有PROCESS_TERMINATE訪問權(quán)的進(jìn)程對(duì)象,就可以終止進(jìn)程,并向系統(tǒng)返回指定的代碼。這是一種“野蠻”的終止進(jìn)程的方式,但是有時(shí)卻是需要的。如果開發(fā)人員確實(shí)有機(jī)會(huì)來設(shè)計(jì)“謀殺”(終止別的進(jìn)程的進(jìn)程)和“受害”進(jìn)程(被終止的進(jìn)程)時(shí),應(yīng)該創(chuàng)建一個(gè)進(jìn)程間通訊的內(nèi)核對(duì)象——如一個(gè)互斥程序——這樣一來,“受害”進(jìn)程只在等待或周期性地測(cè)試它是否應(yīng)該終止。3.3.4練習(xí)與實(shí)驗(yàn)本節(jié)“練習(xí)與實(shí)驗(yàn)”的目的是:1)通過創(chuàng)建進(jìn)程、觀察正在運(yùn)行的進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)和調(diào)試操作,進(jìn)一步熟悉操作系統(tǒng)的進(jìn)程概念,理解WindowsXP進(jìn)程的“一生”。2)通過閱讀和分析實(shí)驗(yàn)程序,學(xué)習(xí)創(chuàng)建進(jìn)程、觀察進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)方法。1.工具/準(zhǔn)備工作在開始本實(shí)驗(yàn)之前,請(qǐng)回顧教科書的相關(guān)內(nèi)容。需要準(zhǔn)備一臺(tái)運(yùn)行WindowsXPProfessional操作系統(tǒng)的計(jì)算機(jī),且該計(jì)算機(jī)中需安裝VisualC++6.0專業(yè)版或企業(yè)版。2.實(shí)驗(yàn)內(nèi)容與步驟請(qǐng)回答:Windows所創(chuàng)建的每個(gè)進(jìn)程都是以調(diào)用CREATE_SUSPNDEDAPI函數(shù)開始和以調(diào)用ExitProcess()或者TerminateProcess()API函數(shù)終止。(1)創(chuàng)建進(jìn)程本實(shí)驗(yàn)顯示了創(chuàng)建子進(jìn)程的基本框架。該程序創(chuàng)建的子進(jìn)程依然執(zhí)行父進(jìn)程的程序代碼,顯示它的系統(tǒng)進(jìn)程ID和它在進(jìn)程列表中的位置。步驟1:登錄進(jìn)入WindowsXPProfessional。步驟2:在“開始”菜單中單擊“程序”>MicrosoftVisualStudio6.0>MicrosoftVisualC++6.0命令,進(jìn)入VisualC++窗口。步驟3:編輯實(shí)驗(yàn)源程序3-5.cpp(也可直接打開下載的源程序文件3-5.cpp)。清單3-5創(chuàng)建子進(jìn)程//proccreate項(xiàng)目#include<windows.h>#include<iostream>#include<stdio.h>//創(chuàng)建傳遞過來的進(jìn)程的克隆過程并賦于其ID值voidStartClone(intnCloneID){//提取用于當(dāng)前可執(zhí)行文件的文件名TCHARszFilename[MAX_PATH];::GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進(jìn)程的命令行并通知其EXE文件名和克隆IDTCHARszCmdLine[MAX_PATH];::sprintf(szCmdLine,“\”%s\”%d”,szFilename,nCloneID);//用于子進(jìn)程的STARTUPINFO結(jié)構(gòu)STARTUPINFOsi;::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));si.cb=sizeof(si); //必須是本結(jié)構(gòu)的大小//返回的用于子進(jìn)程的進(jìn)程信息PROCESS_INFORMATIONpi;//利用同樣的可執(zhí)行文件和命令行創(chuàng)建進(jìn)程,并賦于其子進(jìn)程的性質(zhì)BOOLbCreateOK=::CreateProcess(szFilename, //產(chǎn)生這個(gè)EXE的應(yīng)用程序的名稱szCmdLine, //告訴其行為像一個(gè)子進(jìn)程的標(biāo)志NULL, //缺省的進(jìn)程安全性NULL, //缺省的線程安全性FALSE, //不繼承句柄CREATE_NEW_CONSOLE, //使用新的控制臺(tái)NULL, //新的環(huán)境NULL, //當(dāng)前目錄&si, //啟動(dòng)信息&pi); //返回的進(jìn)程信息//對(duì)子進(jìn)程釋放引用if(bCreateOK){::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);}}intmain(intargc,char*argv[]){//確定進(jìn)程在列表中的位置intnClone(0);if(argc>1){//從第二個(gè)參數(shù)中提取克隆ID::sscanf(argv[1],“%d”,&nClone);}//顯示進(jìn)程位置std::cout<<“ProcessID:“<<::GetCurrentProcessId()<<“,CloneID:“<<nClone<<std::endl;//檢查是否有創(chuàng)建子進(jìn)程的需要constintc_nCloneMax=25;if(nClone<c_nCloneMax){//發(fā)送新進(jìn)程的命令行和克隆號(hào)StartClone(++nClone);}//在終止之前暫停一下,輸入一個(gè)字符后,程序結(jié)束,以便觀察std::cout<<”inputachar:”;getchar();std::cout<<“I’mgone...Bye-bye”;::Sleep(1000);return0;}步驟4:?jiǎn)螕鬊uild菜單中的Compile3-5.cpp命令,系統(tǒng)顯示:Thisbuildcommandrequiresanactiveprojectworkspace.Wouldyouliketocreateadefaultprojectworkspace?(build命令需要一個(gè)活動(dòng)的項(xiàng)目工作空間。你是否希望建立一個(gè)缺省的項(xiàng)目工作空間?)單擊“是”按鈕確認(rèn)。系統(tǒng)對(duì)3-5.cpp進(jìn)行編譯。步驟5:編譯完成后,單擊Build菜單中的Build3-5.exe命令,建立3-5.exe可執(zhí)行文件。操作能否正常進(jìn)行?如果不行,則可能的原因是什么?能步驟6:在工具欄單擊ExecuteProgram(執(zhí)行程序)按鈕,或者按Ctrl+F5鍵,或者單擊Build菜單中的Execute3-5.exe命令,執(zhí)行3-5.exe程序。步驟7:按Ctrl+S鍵可暫停程序的執(zhí)行,按Ctrl+Pause(Break)鍵可終止程序的執(zhí)行。清單3-5展示的是一個(gè)簡(jiǎn)單的使用CreateProcess()API函數(shù)的例子。首先形成簡(jiǎn)單的命令行,提供當(dāng)前的EXE文件的指定文件名和代表生成克隆進(jìn)程的起始號(hào)碼。大多數(shù)參數(shù)都可取缺省值,但是創(chuàng)建標(biāo)志參數(shù)使用了:________________________________________________________________________標(biāo)志,指示新進(jìn)程分配它自己的控制臺(tái),這使得運(yùn)行示例程序時(shí),在任務(wù)欄上產(chǎn)生許多活動(dòng)標(biāo)記。然后該克隆進(jìn)程的創(chuàng)建方法關(guān)閉傳遞過來的句柄并返回main()函數(shù)。在關(guān)閉程序之前,每一進(jìn)程的執(zhí)行主線程都會(huì)暫停等待輸入字符,以便讓用戶觀察子進(jìn)程的行為。CreateProcess()函數(shù)有___10_____個(gè)核心參數(shù)?本實(shí)驗(yàn)程序中設(shè)置的各個(gè)參數(shù)的值及其含義是: 值 含義參數(shù)名稱使用目的LPCTSTRlpApplivationName全部或部分地指明包括可執(zhí)行代碼的EXE文件的文件名LPCTSTRlpCommandLine向可執(zhí)行文件發(fā)送的參數(shù)LPSECURIITY_ATTRIBUTESlpProcessAttributes返回進(jìn)程句柄的安全屬性。主要指明這一句柄是否應(yīng)該由其他子進(jìn)程所繼承LPSECURIITY_ATTRIBUTESlpThreadAttributes返回進(jìn)程的主線程的句柄的安全屬性BOOLbInheritHandle一種標(biāo)志,告訴系統(tǒng)允許新進(jìn)程繼承創(chuàng)建者進(jìn)程的句柄DWORDdwCreationFlage特殊的創(chuàng)建標(biāo)志(如CREATE_SUSPENDED)的位標(biāo)記LPVOIDlpEnvironment向新進(jìn)程發(fā)送的一套環(huán)境變量;如為null值則發(fā)送調(diào)用者環(huán)境LPCTSTRlpCurrentDirectory新進(jìn)程的啟動(dòng)目錄STARTUPINFOlpStartupInfoSTARTUPINFO結(jié)構(gòu),包括新進(jìn)程的輸入和輸出配置的詳情L(zhǎng)PPROCESS_INFORMATIONlpProcessInformation調(diào)用的結(jié)果塊;發(fā)送新應(yīng)用程序的進(jìn)程和主線程的句柄和ID程序運(yùn)行時(shí)屏幕顯示的信息是:提示:部分程序在VisualC++環(huán)境完成編譯、鏈接之后,可在WindowsXP的“命令提示符”狀態(tài)下執(zhí)行該程序,并且有些程序還可以在命令后加參數(shù)運(yùn)行,看看與在可視化界面下運(yùn)行的結(jié)果有沒有不同?為什么?(2)正在運(yùn)行的進(jìn)程本實(shí)驗(yàn)的程序中列出了用于進(jìn)程信息查詢的API函數(shù)GetProcessVersion()與GetVersionEx()的共同作用,可確定運(yùn)行進(jìn)程的操作系統(tǒng)的版本號(hào)。步驟1:用VisualC++編輯實(shí)驗(yàn)源程序3-6.cpp(也可直接打開下載的源程序文件3-6.cpp)。清單3-6使用進(jìn)程和操作系統(tǒng)的版本信息//version項(xiàng)目#include<windows.h>#include<iostream>//利用進(jìn)程和操作系統(tǒng)的版本信息的簡(jiǎn)單示例voidmain(){//提取這個(gè)進(jìn)程的ID號(hào)DWORDdwIdThis=::GetCurrentProcessId();//獲得這一進(jìn)程和報(bào)告所需的版本,也可以發(fā)送0以便指明這一進(jìn)程DWORDdwVerReq=::GetProcessVersion(dwIdThis);WORDwMajorReq=(WORD)(dwVerReq>16);WORDwMinorReq=(WORD)(dwVerReq&0xffff);std::cout<<“ProcessID:“<<dwIdThis<<“,requiresOS:“<<wMajorReq<<wMinorReq<<std::endl;//設(shè)置版本信息的數(shù)據(jù)結(jié)構(gòu),以便保存操作系統(tǒng)的版本信息OSVERSIONINFOEXosvix;::ZeroMemory(&osvix,sizeof(osvix));osvix.dwOSVersionInfoSize=sizeof(osvix);//提取版本信息和報(bào)告::GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvix));std::cout<<“RunningonOS:“<<osvix.dwMajorVersion<<“.”<<osvix.dwMinorVersion<<std::endl;//顯示進(jìn)程當(dāng)前優(yōu)先級(jí)DWORDdwProcessP:GetPriorityClass(GetCurrentProcess());std::cout<<”Currentprocesspriorityis:”;switch(dwProcessP){caseHIGH_PRIORTY_CLASS:std::cout<<”High”;break;caseNORMAL_PRIORTY_CLASS:std::cout<<”Normal”;break;caseIDLE_PRIORTY_CLASS:std::cout<<”Idle”;break;caseREALTIME_PRIORTY_CLASS:std::cout<<”RealTime”;break;default:std::cout<<”unknow”;break;}std::cout<<std::endl;//如果是NTS(Windows2000)系統(tǒng),則提高其優(yōu)先權(quán)if(osvix.dwPlatformld==VER_PLATFORM_WIN32_NT&&osvix.dwMajorVersion>=5){if(dwProcessP!=HIGH_PRIORITY_CLASS){//如果當(dāng)前優(yōu)先級(jí)不是high,則改變優(yōu)先級(jí)::SetPriorityClass(::GetCurrentProcess(), //利用這一進(jìn)程HIGH_PRIORITY_CLASS); //改變?yōu)閔igh//報(bào)告給用戶dwProcessP=GetPriorityClass(GetCurrentProcess());std::cout<<"Theprocesspriorityhavebeenchangedto";switch(dwProcessP){caseHIGH_PRIORITY_CLASS: std::cout<<"High"; break;caseNORMAL_PRIORITY_CLASS: std::cout<<"Normal"; break;caseIDLE_PRIORITY_CLASS: std::cout<<"Idle";break;caseREALTIME_PRIORITY_CLASS: std::cout<<"Realtime"; break;default: std::cout<<"<unknow>"; break;}std::cout<<std::endl;}}步驟2:?jiǎn)螕鬊uild菜單中的Compile3-6.cpp命令,再單擊“是”確認(rèn)。系統(tǒng)對(duì)3-6.cpp進(jìn)行編譯。步驟3:編譯完成后,單擊Build菜單中的Build3-6.exe命令,建立3-6.exe可執(zhí)行文件。請(qǐng)記錄:操作能否正常進(jìn)行?如果不行,則可能的原因是什么?不能?。。〔襟E4:在工具欄單擊ExecuteProgram(執(zhí)行程序)按鈕,執(zhí)行3-6.exe程序。運(yùn)行結(jié)果:當(dāng)前PID信息:528當(dāng)前操作系統(tǒng)版本:__WindowsXP_系統(tǒng)提示信息:無法執(zhí)行清單3-6中的程序向讀者表明了如何獲得當(dāng)前的PID和所需的進(jìn)程版本信息。為了運(yùn)行這一程序,系統(tǒng)處理了所有的版本不兼容問題。接著,程序演示了如何使用GetVersionEx()API函數(shù)來提取OSVERSIONINFOEX結(jié)構(gòu)。這一數(shù)據(jù)塊中包括了操作系統(tǒng)的版本信息。其中,“OS:5.1”表示當(dāng)前運(yùn)行的操作系統(tǒng)是:__WindowsXP_清單3-6的最后一段程序利用了操作系統(tǒng)的版本信息,以確認(rèn)運(yùn)行的是WindowsXP。代碼接著將當(dāng)前進(jìn)程的優(yōu)先級(jí)提高到比正常級(jí)別高。步驟5:?jiǎn)螕鬋trl+Alt+Del鍵,進(jìn)入“Windows任務(wù)管理器”,在“應(yīng)用程序”選項(xiàng)卡中右鍵單擊“3-6”任務(wù),在快捷菜單中選擇“轉(zhuǎn)到進(jìn)程”命令。請(qǐng)記錄:在“Windows任務(wù)管理器”的“進(jìn)程”選項(xiàng)卡中,與“3-6”任務(wù)對(duì)應(yīng)的進(jìn)程映像名稱是(為什么?):右鍵單擊該進(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)程句柄即可。SetProcessAffinityMask()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ù),即SetProcessShutdownParameters(),可告訴系統(tǒng)如何終止該進(jìn)程。(3)終止進(jìn)程在清單3-7列出的程序中,先創(chuàng)建一個(gè)子進(jìn)程,然后向該子進(jìn)程發(fā)出“自殺彈”互斥體去終止子進(jìn)程的運(yùn)行。步驟1:用VisualC++編輯實(shí)驗(yàn)源程序3-7.cpp(也可直接打開下載的源程序文件3-7.cpp)。清單3-7指令其父進(jìn)程來“殺掉”自己的子進(jìn)程//procterm項(xiàng)目#include<windows.h>#include<iostream>#include<stdio.h>staticLPCTSTRg_szMutexName=“w2kdg.ProcTerm.mutex.Suicide”;//創(chuàng)建當(dāng)前進(jìn)程的克隆進(jìn)程的簡(jiǎn)單方法voidStartClone(){//提取當(dāng)前可執(zhí)行文件的文件名TCHARszFilename[MAX_PATH];::GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進(jìn)程的命令行,指明它是一個(gè)EXE文件和子進(jìn)程TCHARszCmdLine[MAX_PATH];::sprintf(szCmdLine,“\”%s\“child”,szFilename);//子進(jìn)程的啟動(dòng)信息結(jié)構(gòu)STARTUPINFOsi;::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));si.cb=sizeof(si); //應(yīng)當(dāng)是此結(jié)構(gòu)的大小//返回的用于子進(jìn)程的進(jìn)程信息PROCESS_INFORMATIONpi;//用同樣的可執(zhí)行文件名和命令行創(chuàng)建進(jìn)程,并指明它是一個(gè)子進(jìn)程BOOLbCreateOK=::CreateProcess(szFilename, //產(chǎn)生的應(yīng)用程序名稱(本EXE文件)szCmdLine, //告訴我們這是一個(gè)子進(jìn)程的標(biāo)志NULL, //用于進(jìn)程的缺省的安全性NULL, //用于線程的缺省安全性FALSE, //不繼承句柄CREATE_NEW_CONSOLE, //創(chuàng)建新窗口,使輸出更直觀NULL, //新環(huán)境NULL, //當(dāng)前目錄&si, //啟動(dòng)信息結(jié)構(gòu)&pi); //返回的進(jìn)程信息//釋放指向子進(jìn)程的引用if(bCreateOK){::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);}}voidParent(){//創(chuàng)建“自殺”互斥程序體HANDLEhMutexSuicide=::CreateMutex(NULL, //缺省的安全性TRUE, //最初擁有的g_szMutexName); //為其命名if(hMutexSuicide!=NULL){//創(chuàng)建子進(jìn)程std::cout<<“Creatingthechildprocess.”<<std::endl;::StartClone();//暫停::Sleep(5000);//指令子進(jìn)程“殺”掉自身std::cout<<“Tellingthechildprocesstoquit.”<<std::endl;::ReleaseMutex(hMutexSuicide);//消除句柄::CloseHandle(hMutexSuicide);}}voidChild(){//打開“自殺”互斥體HANDLEhMutexSuicide=::OpenMutex(SYNCHRONIZE, //打開用于同步FALSE, //不需要向下傳遞g_szMutexName); //名稱if(hMutexSuicide!=NULL){//報(bào)告正在等待指令std::cout<<“Childwaitingforsuicideinstructions.”<<std::endl;::WaitForSingleObject(hMutexSuicide,INFINITE);//準(zhǔn)備好終止,清除句柄std::cout<<“Childquiting.”<<std::endl;
::CloseHandle(hMutexSuicide);::Sleep(1000); //延遲子進(jìn)程的結(jié)束,以便觀察}}intmain(intarqc,char*argv[]){//決定其行為是父進(jìn)程還是子進(jìn)程if(argc>l&&::strcmp(argv[l],“child”)==0){Child();}else{Parent();}return0;}清單3-7中的程序說明了一個(gè)進(jìn)程從“生”到“死”的整個(gè)一生。第一次執(zhí)行時(shí),它創(chuàng)建一個(gè)子進(jìn)程,其行為如同“父親”。在創(chuàng)建子進(jìn)程之前,先創(chuàng)建一個(gè)互斥的內(nèi)核對(duì)象,其行為對(duì)于子進(jìn)程來說,如同一個(gè)“自殺彈”。當(dāng)創(chuàng)建子進(jìn)程時(shí),就打開了互斥體并在其他線程中進(jìn)行別的處理工作,同時(shí)等待著父進(jìn)程使用ReleaseMutex()API發(fā)出“死亡”信號(hào)。然后用Sleep()API調(diào)用來模擬父進(jìn)程處理其他工作,等完成時(shí),指令子進(jìn)程終止。當(dāng)調(diào)用ExitProcess()時(shí)要小心,進(jìn)程中的所有線程都被立刻通知停止。在設(shè)計(jì)應(yīng)用程序時(shí),必須讓主線程在正常的C++運(yùn)行期關(guān)閉(這是由編譯器提供的缺省行為)之后來調(diào)用這一函數(shù)。當(dāng)它轉(zhuǎn)向受信狀態(tài)時(shí),通??蓜?chuàng)建一個(gè)每個(gè)活動(dòng)線程都可等待和停止的終止事件。在正常的終止操作中,進(jìn)程的每個(gè)工作線程都要終止,由主線程調(diào)用ExitProcess()。接著,管理層對(duì)進(jìn)程增加的所有對(duì)象釋放引用,并將用GetExitCodeProcess()建立的退出代碼從STILL_ACTIVE改變?yōu)樵贓xitProcess()調(diào)用中返回的值。最后,主線程對(duì)象也如同進(jìn)程對(duì)象一樣轉(zhuǎn)變?yōu)槭苄艩顟B(tài)。等到所有打開的句柄都關(guān)閉之后,管理層的對(duì)象管理器才銷毀進(jìn)程對(duì)象本身。還沒有一種函數(shù)可取得終止后的進(jìn)程對(duì)象為其參數(shù),從而使其“復(fù)活”。當(dāng)進(jìn)程對(duì)象引用一個(gè)終止了的對(duì)象時(shí),有好幾個(gè)API函數(shù)仍然是有用的。進(jìn)程可使用退出代碼將終止方式通知給調(diào)用GetExitCodeProcess()的其他進(jìn)程。同時(shí),GetProcessTimes()API函數(shù)可向主調(diào)者顯示進(jìn)程的終止時(shí)間。步驟2:?jiǎn)螕鬊uild菜單中的Compile3-7.cpp命令,再單擊“是”按鈕確認(rèn)。系統(tǒng)對(duì)3-7.cpp進(jìn)行編譯。步驟3:編譯完成后,單擊Build菜單中的Build3-7.exe命令,建立3-7.exe可執(zhí)行文件。請(qǐng)記錄:操作能否正常進(jìn)行?如果不行,則可能的原因是什么?無法正常運(yùn)行,代碼中存在語(yǔ)法和數(shù)據(jù)類型的錯(cuò)誤和不匹配步驟4:在工具欄單擊ExecuteProgram按鈕,執(zhí)行3-7.exe程序。步驟5:在熟悉清單3-7源代碼的基礎(chǔ)上,利用本實(shí)驗(yàn)介紹的API函數(shù)來嘗試改進(jìn)本程序(例如使用GetProcessTimes()API函數(shù))并運(yùn)行。請(qǐng)描述你所做的工作:3.實(shí)驗(yàn)總結(jié)通過自己動(dòng)手,自己自己創(chuàng)建了進(jìn)程以及關(guān)閉進(jìn)程。4.實(shí)驗(yàn)評(píng)價(jià)(教師)____________________________________________________________________________________________________________________________________________3.3.5閱讀與思考:Linux操作系統(tǒng)Linux操作系統(tǒng)(Linux)是一類計(jì)算機(jī)操作系統(tǒng)的統(tǒng)稱(此外,Linux也是一顆小行星的名字)。Linux操作系統(tǒng)的內(nèi)核的名字也是“Linux”;Linux操作系統(tǒng)也是自由軟件和開放源代碼發(fā)展中最著名的例子。嚴(yán)格來講,Linux這個(gè)詞本身只表示Linux內(nèi)核,但在實(shí)際上人們已經(jīng)習(xí)慣了用Linux來形容整個(gè)基于Linux內(nèi)核,并且使用GNU工程各種工具和數(shù)據(jù)庫(kù)的操作系統(tǒng)(也被稱為GNU/Linux)?;谶@些組件的Linux軟件被稱為L(zhǎng)inux發(fā)行版。一般來講,一個(gè)Linux發(fā)行包包含大量的軟件,比如軟件開發(fā)工具(例如gcc)、數(shù)據(jù)庫(kù)(例如PostgreSQL、MySQL)、Web服務(wù)器(例如Apache)、XWindow、桌面環(huán)境(例如GNOME和KDE)、辦公包(例如OpenO)、腳本語(yǔ)言(例如Perl、PHP和Python)等。Linux內(nèi)核最初是為英特爾386微處理器設(shè)計(jì)的?,F(xiàn)在Linux內(nèi)核支持從個(gè)人電腦到大型主機(jī)甚至包括嵌入式系統(tǒng)在內(nèi)的各種硬件設(shè)備。Linux已經(jīng)成為了一種受到廣泛關(guān)注和支持的一種操作系統(tǒng)。包括IBM和惠普、戴爾在內(nèi)的一些計(jì)算機(jī)業(yè)巨頭也開始支持Linux。很多人認(rèn)為,和其他的商用Unix系統(tǒng)以及微軟Windows相比,作為自由軟件的Linux具有低構(gòu)建成本,高安全性,更加可信賴等優(yōu)勢(shì)。資料來源:維基百科(/wiki/Linux)請(qǐng)分析:閱讀以上文章,你能得到什么啟發(fā)?請(qǐng)簡(jiǎn)述之。對(duì)LINUX內(nèi)核有了基本的了解,知道內(nèi)核基本設(shè)計(jì)以及系統(tǒng)支。3.4管理Linux系統(tǒng)進(jìn)程3.4.1Linux系統(tǒng)進(jìn)程的管理在本實(shí)驗(yàn)中,我們將使用Linux命令工作,來標(biāo)識(shí)和控制系統(tǒng)進(jìn)程。Linux操作系統(tǒng)使用進(jìn)程管理作業(yè),進(jìn)程由系統(tǒng)或者用戶初始化。用戶在Linux環(huán)境下執(zhí)行的作業(yè)大多數(shù)都會(huì)啟動(dòng)一個(gè)進(jìn)程。進(jìn)程可以啟動(dòng)或者派生一個(gè)子進(jìn)程,這樣創(chuàng)建了一個(gè)進(jìn)程層次結(jié)構(gòu)或者進(jìn)程樹,類似于具有父子關(guān)系的文件系統(tǒng)層次結(jié)構(gòu)??梢允褂胮s(進(jìn)程狀態(tài))命令工作,監(jiān)控系統(tǒng)進(jìn)程,使用kill命令終止不想要的進(jìn)程。3.4.2練習(xí)與實(shí)驗(yàn)本節(jié)“練習(xí)與實(shí)驗(yàn)”的目的是:1)回顧系統(tǒng)進(jìn)程的概念,加深對(duì)Linux/UNIX進(jìn)程管理的理解。2)回顧ps命令和選項(xiàng)。3)列出當(dāng)前shell中的進(jìn)程。4)列出運(yùn)行在系統(tǒng)中的所有進(jìn)程。5)根據(jù)命令名搜索特定的進(jìn)程。6)確定一個(gè)進(jìn)程,終止它。7)使用kill命令終止進(jìn)程。8)根據(jù)用戶查找和終止進(jìn)程。9)根據(jù)命令名終止進(jìn)程。1.工具/準(zhǔn)備工作在開始本實(shí)驗(yàn)之前,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 游樂園服務(wù)行業(yè)營(yíng)銷策略方案
- 地?zé)岚l(fā)電和直接利用設(shè)備相關(guān)行業(yè)投資方案
- 2懸挑式腳手架施工方案-5416
- 中秋節(jié)聯(lián)歡會(huì)致辭范文(10篇)
- 九月大班上學(xué)期月計(jì)劃范文(5篇)
- 中秋晚會(huì)董事長(zhǎng)致辭范文(13篇)
- 曹植課件教學(xué)課件
- 講師比賽課件教學(xué)課件
- 影響高中數(shù)學(xué)成績(jī)的原因及解決方法
- 消費(fèi)品和有關(guān)服務(wù)的比較試驗(yàn) 實(shí)施要求 編制說明
- 燈檢機(jī)使用、維護(hù)和檢修標(biāo)準(zhǔn)操作規(guī)程
- 企業(yè)評(píng)標(biāo)專家推薦表
- 接地電阻測(cè)試記錄表范本
- 樁基單樁水平靜載試驗(yàn)檢測(cè)方案
- DB11-T1496-2017健康體檢服務(wù)規(guī)范
- 體育課教案-游泳
- 小學(xué)語(yǔ)文人教六年級(jí)上冊(cè)(統(tǒng)編2023年更新)第八單元-生活中的魯迅
- 小學(xué)生自我介紹豎版
- 某小區(qū)物業(yè)費(fèi)收支預(yù)算表(公示用)
- 汽車技術(shù)服務(wù)與營(yíng)銷專業(yè)建設(shè)情況
- 電焊作業(yè)風(fēng)險(xiǎn)分析及管控措施
評(píng)論
0/150
提交評(píng)論