版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
試驗一進程控制與描述WindowsXP進程的"畢生"。二、試驗環(huán)境三、試驗內(nèi)容和環(huán)節(jié)WindowsXP可以識別的程序包括控制臺應(yīng)用程序、GUI應(yīng)用程序和服務(wù)應(yīng)用程序。1、簡樸的控制臺應(yīng)用程序[}2、GUI應(yīng)用程序}也可以運用任何其他文本編輯器鍵入程序代碼,假如這樣,例如使用WORD來鍵入和編輯程序,則應(yīng)當(dāng)注意什么問題?在“命令提醒符”窗口運行CLEXE,產(chǎn)生1-2.EXE文獻:在程序1-2的GUT應(yīng)用程序中,首先需要Windows.h頭文獻,以便獲得傳送給WinMainO和MessageBox)API函數(shù)的數(shù)據(jù)類型定義。接著的pragma指令指示編譯器連接器找到User32.LIB庫文獻并將其與產(chǎn)生的EXE文獻連接起來。這樣就可以運行簡樸的命令行命令CLMsgBox.CPP來創(chuàng)立這一應(yīng)用程序,假如沒有pragma指令,則MessageBox)API函數(shù)就成為未定義的了。這一指令是VisualStudioC++編譯器特有的。接下來是WinMainO措施。其中有四個由實際的低級入口點傳遞來的參數(shù)。hlnstance參數(shù)用來裝入與代碼相連的圖標(biāo)或位圖一類的資源,無論何時,都可用GetModuleHandleOAPI函數(shù)將這些資源提取出來。系統(tǒng)運用實例句柄來指明代碼和初始的數(shù)據(jù)裝在內(nèi)存的何處。句柄的數(shù)值實際上是EXE文獻映像的基地址,一般為0x00400000。下一種參數(shù)hPrevInstance是為向后兼容而設(shè)的,目前系統(tǒng)將其設(shè)為NULL。應(yīng)用程序的命令行(不包括程序的名稱)是IpCmdLine參數(shù)。此外,系統(tǒng)運用nCmdShow參數(shù)告訴應(yīng)用程序怎樣顯示它的主窗口(選項包括最小化、最大化和正常)。最終,程序調(diào)用MessageBox0)API函數(shù)并退出。假如在進入消息循環(huán)之前就結(jié)束運行的話,最終必須返回0。運行成果(試將其中的信息與程序1-1.EXE的運行成果進行比較):彈出一種消息框,標(biāo)題為Greetings,內(nèi)容為Hello,Windows,中間有一種確認(rèn)按鈕3、進程對象操作系統(tǒng)將目前運行的應(yīng)用程序看作是進程對象。運用系統(tǒng)提供的惟一的稱為句柄(HANDLE)的號碼,就可與進程對象交互。這一號碼只對目前進程有效。本試驗表達了一種簡樸的進程句柄的應(yīng)用。在系統(tǒng)中運行的任何進程都可調(diào)用GetCurrentProcessOAPI函數(shù),此函數(shù)可返回標(biāo)識進程自身的句柄。然后就可在Windows需要該進程的有關(guān)狀況時,運用這一句柄來提供。程序1-3:獲得和使用進程的句柄(std:cout<<"Currentproces{程序1-3中列出的是一種獲得進程句柄的措施。對于進程句柄可進行的惟一有用的操作是在API調(diào)用時,將其作為參數(shù)傳送給系統(tǒng),正如程序1-3中對GetPriorityClassOAPI函數(shù)的調(diào)用那樣。在這種狀況下,系統(tǒng)向進程對象內(nèi)“窺視”,以決定其優(yōu)先級,然后將此優(yōu)先級返回給應(yīng)用程序。OpenProcessO和CreateProcessOAPI函數(shù)也可以用于提取進程句柄。前者提取的是已經(jīng)存在的進程的句柄,而后者創(chuàng)立一種新進程,并將其句柄提供出來。在“命令提醒符”窗口運行CLEXE,產(chǎn)生1-3.EXE文獻:將程序1-4.cpp程序鍵入記事本中,并把代碼保留為1-4.cpp。程序1-4顯示怎樣找出系統(tǒng)中正在運行的所有進程,怎樣運用OpenProcessOAPI函數(shù)來獲得每一種訪問進程的深入信息。程序1-4運用句柄查出進程的詳細(xì)信息//proclist項目DWORDGetKemelModePerc(/將構(gòu)造轉(zhuǎn)化為64位整數(shù)(((ULONGLONG)ftKerneldwHighDate(((ULONGLONG)ftUser.dwHighDateULONGLONGqwTotal=qwKernel+qwU(DWORD)((ULONGLONG)100*qwKernel(/對目前系統(tǒng)中運行的進程拍取“快照”HANDLEhSnapshot=::CreateToolhelp32SnTH32CS-SNAPPROCESS,//提取目前進程BOOLbMore=::Process32First(hSnapshoHANDLEhProcess=::OpenPrpe.th32ProcessID);//要打開的{ftCreation,ftExit,ftKemelMode,hProcess,/所感愛好的進程&ftCreation,//進&ftExit,/結(jié)束時間(假如有的話)&ftKernelMode,/在內(nèi)核模DWORDdwPctKernel=::GetKernelModePerstd::cout<<"ProcessID:"<<p<<",EXEfile:"<<pe.sz<<",%inkernelmode:"<</消除句柄}bMore=::Process32Next(hSnapshot,&p}}程序1-4程序首先運用WindowsXP的新特性,即工具協(xié)助庫來獲得目前運行的所有進程的快照。然后應(yīng)用程序進入快照中的每一種進程,得到其以PROCESSENTRY32構(gòu)造表達的屬性。這一構(gòu)造用來向OpenProcessOAPI函數(shù)提供進程的ID。Windows跟蹤每一進程的有關(guān)時間,示例中是通過打開的進程句柄和GetProcessTimesOAPI來直詢得到有關(guān)時間的。接下來,一種定制的協(xié)助函數(shù)獲得了幾種返回的數(shù)值,然后計算進程在內(nèi)核模式下消耗的時間占總時間的比例。程序的其他部分比較簡樸,只是將有關(guān)信息顯示給顧客,清除進程句柄,然后繼續(xù)循環(huán),直到所有進程都計算過為止。在“命令提醒符”窗口運行CLEXE,產(chǎn)生1-4.EXE文獻:運行成果:西C:\Docuents運行成果:西C:\DocuentsandSettinga\AdiniatrProceoID:768.EXEfile:GmGE.oxe.*inkernelProceGID:900.EXEfile:vinlogon·oxe.*nkernelID:956:EXE_fle:LSAs1136.EXEfile:svohoot.exe.*inID:ID:4972EXEFID:6132.EXE*inkernel努部第二部分:進程的“畢生”Windows所創(chuàng)立的每個進程都從調(diào)用CreateProcessOAPI函數(shù)開始,該函數(shù)的任務(wù)是在對象管理器子系統(tǒng)內(nèi)初始化進程對象。每一進程都以調(diào)用ExitProcess(或TerminatePocess()API函數(shù)終止。一般應(yīng)用程序的框架負(fù)責(zé)調(diào)用ExitProcessO函數(shù)。對于C++運行庫來說,這一調(diào)用發(fā)生在應(yīng)用程序的mainO函數(shù)返回之后。本試驗顯示了創(chuàng)立子進程的基本框架。該程序創(chuàng)立的子進程仍然執(zhí)行父進程的程序代碼,顯示它的系統(tǒng)進程ID和它在進程列表中的位置。創(chuàng)立子進程//proccreate項目(:sprintf(szCmdLine,"\"%s'//用于子進程的STARTUPINFO構(gòu)造:ZeroMemory(reinterpret_cast<void*>(&si)si.cb=sizeof(si);BOOLbCreateOK=::CreatePNULL,/缺省的進程安全性NULL,NULL,/不繼承句柄/使用新的控制臺{)ntmainintargc,char*a/確定進程在列表中的位置(std::cout<<"ProcessID:"<<::GetCurrentProcessId0/檢查與否有創(chuàng)立子進程的需要(std;cout<<"I'mgone...Bye-bye";)本程序展示的是一種簡樸的使用CreateProcessOAPI函數(shù)的例子。首先形成簡樸的命令行,提供目前的EXE文獻的指定文獻名和代表生成克隆進程的號碼。大多數(shù)參數(shù)都可取缺省值,不過創(chuàng)立標(biāo)志參數(shù)使用了:行為像一種子進程標(biāo)志,指示新進程分派它自己的控制臺,這使得運行示例程序時,在任務(wù)欄上產(chǎn)生許多活動標(biāo)識。然后該克隆進程的創(chuàng)立措施關(guān)閉傳遞過來的句柄并返回mainO函數(shù)。在關(guān)閉程序之前,每一進程的執(zhí)行主線程都會暫停等待輸入字符,以便讓顧客觀測子進程的行為。CreateProcess)函數(shù)有5個關(guān)鍵參數(shù)?本試驗程序中設(shè)置的各個參數(shù)的值的含義是:a.(LPCTSTRIpApplicatic.(BOOLblnheritHandles)FALSE,//不繼承句柄:e.(LPPROCESS_INFORMATONIpProcessInformation)&pi);//返回的進程信息程序運行時屏幕顯示的信息是:ProcessID:3344,CloneProcessID:3344,CloneI'ngone…Bye-byePre本試驗的程序中列出了用于進程信息查詢的API函數(shù)GetProcessVersion(與GetVersionEx(的共同作用,可確定運行進程的操作系統(tǒng)的版本號。{/提取這個進程的ID號DWORDdwdThis=::GetCurreWORDwMajorReq=(WORD)dwVerRWORDwMinorReq=(WORD)dwVerReq&0xfff);std::cout<<"Process<<",requiresOS"<<wMajorReq<<wMinorReq<<std//設(shè)置版本信息的數(shù)據(jù)構(gòu)造,以便保留操作系統(tǒng)的版本信息osvix.dwOSVersionInfoSize=sizeoGetVersionEx(reinterpret_cast<LPOSVERSIONINFOstd::cout<<"RunningonOS:"<<osvix.dwMajorVersion<<"."<<osvix.dwMinorVersion<<std::eif(osvix.dwPlatformld==VER_PLATFORM_W(:GetCurrentProcess(),/運用這一進程/匯報給顧客std::cout<<"TaskManagershouldnownowindicat"processishighpriority."<<std:eProcessID:5436,requiresProcessID:5436,requires目前PID信息:5436目前操作系統(tǒng)版本:5.1系統(tǒng)提醒信息:TaskManagershouldnownowindicatethisprocessishighpriority程序向讀者表明了怎樣獲得目前的PID和所需的進程版本信息。為了運行這一程序,系統(tǒng)處理了所有的版本不兼容問題。接著,程序演示了怎樣使用GetVersionExOAPI函數(shù)來提取OSVERSIONINFOEX構(gòu)造。這一數(shù)據(jù)塊中包括了操作系統(tǒng)的版本信息。其中,“OS:5.1”表達目前運行的操作系統(tǒng)是:最終一段程序運用了操作系統(tǒng)的版本信息,以確認(rèn)運行的是WindowsXP。代碼接著將目前進程的優(yōu)先級提高到比正常級別高。單擊Crl+Alt+Del鍵,進入“Windows任務(wù)管理器”,在“應(yīng)用程序”選項卡中右鍵單擊本任務(wù),在快捷菜單中選擇“轉(zhuǎn)到進程”命令。在“Windows任務(wù)管理器”的“進程”選項卡中,與本任務(wù)對應(yīng)的進程映像名稱是(為何?):右鍵單擊該進程名,在快捷菜單中選擇“設(shè)置優(yōu)先級”命令,可以調(diào)整該進程的優(yōu)先級,如設(shè)置為“高”后重新運行程序,屏幕顯示有變化嗎?沒有指令其父進程來“殺掉”自己的子進程(//格式化用于子進程的命令行,指明它是一種EXE文獻和子進程::sprintf(szCmdLine,//子進程的啟動信息構(gòu)造::ZeroMemory(reinterpret_cast<void*si.cb=sizeof(si);//應(yīng)當(dāng)是此構(gòu)造的大小//返回的用于子進程的進程信息//用同樣的可執(zhí)行文獻名和命令行創(chuàng)立進程,并指明它是一種子進程BOOLbCreateOK=::CreateProcess(NULL,NULL,NULL,NULL,//釋放指向子進程的引用{{/創(chuàng)立“自殺”互斥程序體//產(chǎn)生的應(yīng)用程序名稱(本EXE文獻)/告訴我們這是一種子進程的標(biāo)志//用于進程的缺省的安全性/用于線程的缺省安全性/不繼承句柄//創(chuàng)立新窗口,使輸出更直觀//新環(huán)境//目前目錄/啟動信息構(gòu)造/1返回的進程信息HANDLEhMutexSuicide=::CreatNULL,{/缺省的安全性//最初擁有的/為其命名std::cout<<"Creatingthechildproc//指令子進程“殺”掉自身std::cout<<"Tellingthechildprocesstoquit."<<std::endl;//消除句柄}{/打開“自殺”互斥體HANDLEhMutexSuicide=::OpeSYNCHRONIZE,/打開用于同步FALSE,/不需要向下傳遞g_szMutexName);//名稱{/匯報正在等待指令std::cout<<"Childwaitingforsuicideinst::WaitForSingleObject(hMutex//準(zhǔn)備好終正,清除句柄std::cout<<"Childquiting."<<std::end;{//決定其行為是父進程還是子進程if(argc>1&&::strcmp(argv[l],"ch{{1程序闡明了一種進程從“生”到“死”的整個畢生。第一次執(zhí)行時,它創(chuàng)立一種子進程,其行為如同“父親”。在創(chuàng)立子進程之前,先創(chuàng)立一種互斥的內(nèi)查對象,其行為對于子進程來說,如同一種“自殺彈”。當(dāng)創(chuàng)立子進程時,就打開了互斥體并在其他線程中進行別的處理工作,同步等待著父進程使用ReleaseMutex)API發(fā)出“死亡”信號。然后用SleepOAPI調(diào)用來模擬父進程處理其他工作,等完畢時,指令子進程終止。當(dāng)調(diào)用ExitProcessO時要小心,進程中的所有線程都被立即告知停止。在設(shè)計應(yīng)用程序時,必須讓主線程在正常的C++運行期關(guān)閉(這是由編譯器提供的缺省行為)之后來調(diào)用這一函數(shù)。當(dāng)它轉(zhuǎn)向受信狀態(tài)時,一般可創(chuàng)立一種每個活動線程都可等待和停止的終止事件。在正常的終止操作中,進程的每個工作線程都要終止,由主線程調(diào)用ExitProcesso。接著,管理層對進程增長的所有對象釋放引用,并將用GetExitCodeProcess(建立的退出代碼從STILL_ACTIVE變化為在ExitProcess(調(diào)用中返回的值。最終,主線程對象也如同進程對象同樣轉(zhuǎn)變?yōu)槭苄艩顟B(tài)。等到所有打開的句柄都關(guān)閉之后,管理層的對象管理器才銷毀進程對象自身。還沒有一種函數(shù)可獲得終止后的進程對象為其參數(shù),從而使其“復(fù)活”。當(dāng)進程對象引用一種終止了的對象時,有好幾種API函數(shù)仍然是有用的。進程可使用退出代碼將終止方式告知給調(diào)用GetExitCodeProcess0的其他進程。同步,GetProcessTimesOAPIGetProcessTimesOAPI函數(shù)可向主調(diào)者顯示進程的終止時間。CreatingthechildproTellingthechildprocess請總結(jié)一下本次試驗的收獲、教訓(xùn)和感受,結(jié)合書本內(nèi)容談一下你對進程的理解。試驗二并發(fā)與調(diào)度在本試驗中,通過對事件和互斥體對象的理解,來加深對WindowsXP線程同步的理解。通過度析試驗程序,理解管理事件對象的API。理解在進程中怎樣使用事件對象,在進程中怎樣使用互斥體對象,線程怎樣通過文獻映射對象發(fā)送數(shù)據(jù)。二、試驗環(huán)境硬件環(huán)境:計算機一臺,局域網(wǎng)環(huán)境;軟件環(huán)境:WindowsXPProfessional,VisualC++6.0專業(yè)版或企業(yè)版。第一部分:互斥體對象本程序中顯示的類CCountUpDown使用了一種互斥體來保證對兩個線程間單一數(shù)值的訪問。每個線程都企圖獲得控制權(quán)來變化該數(shù)值,然后將該數(shù)值寫入輸出流中。創(chuàng)立者實際上創(chuàng)立的是互斥體對象,計數(shù)措施執(zhí)行等待并釋放,為的是共同使用互斥體所需的資源(因而也就是共享資源)。1、運用互斥體保護共享資源//mutex項目{{m_hMutexValue=::CreateMNULL,//缺省的安全性TRUE,m_hThreadlnc=::CreateThNULL,//缺省的安全性IncThreadProc,//類線程進程reinterpret_cast<LPVOID>(this),//線程參數(shù)0,/無特殊的標(biāo)志NULL);/忽視返回的idm_hThreadDec=::CreateThNULL,//缺省的安全性0,/缺省堆棧reinterpret_cast<LPVOID>(this),/線程參數(shù)0,NULL);//忽視返回的id}{}{{/等待兩者完畢(次序并不重要)::WaitForSingleObject(m_h:WaitForSingleObject(m_hTvirtualvoidDoCount(/循環(huán),直到所有的訪問都結(jié)束為止{:WaitForSingleObject(m_hMu/變化并顯示該值std:cout<<"thread:"<<::GetCur<<"access:"<<m_nAccess<<st_/釋放對數(shù)值的訪問}reinterpret_cast<CCountUpDown*>(lpPa}{reinterpret_cast<CCountUpDown*>(lpPaud.WaitForCompletio分析程序的運行成果,可以看到線程(加和減線程)的交替執(zhí)行(由于SleepOAPI容許Windows切換線程)。在每次運行之后,數(shù)值應(yīng)當(dāng)返回初始值(0),由于在每次運行之后寫入線程在等待隊列中變成最終一種,內(nèi)核保證它在其他線程工作時不會再運行。1)請描述運行成果(假如運行不成功,則也許的原因是什么?):兩個線程交替運行,不停變化value兩個線程交替運行,不停變化value的值。兩個線程互斥訪問Value的值hread:3820value:laccethread:5588value:Saccethread:3828value:1accethread:5588value:Baccethread:382ualue:1accethread:550lvalue:Saccethread:3028value:1accethread:558value:Raccthread:5588value:Saccethread:3828value:1accechread:5588value:Bathread:3828value:laccethread:55Bavalue:Baccetheread:3828value:1accethread:550lvalue:faccthread:3829value:laccthread:5508value:Bacthread:5508value:laccthread:5508value:Bathread:3828value:1acthread:550avalue:Baccthread:382lvalue:1acc線程1(5296)先運行,將value值增1,變?yōu)?。然后,線程2(6016)運行,將value值減1,變?yōu)?.獻、文獻映射、郵件位和命名管道等,其中最常用的是文獻和文獻映射。此類對象容許一種線程很輕易地向同一進程或其他進程中的另一線程發(fā)送信息。下邊程序代碼展示了線程怎樣通過文獻對象在永久存儲介質(zhì)上互相發(fā)送數(shù)據(jù)。程序只是激活并啟動了一種線程接著一種線程的創(chuàng)立線程。每個線程從指定的文獻中讀取數(shù)據(jù),并對數(shù)據(jù)進行修改,其修改增量是以創(chuàng)立時發(fā)送給它的數(shù)量進行的,然后將新數(shù)值寫回文獻。//要使用的文獻名staticLPCTSTRg_sx="w//在數(shù)據(jù)文獻中讀取目前數(shù)據(jù)的簡樸線程時將傳遞來的該數(shù)據(jù)增長,并寫回數(shù)據(jù)文獻中staticDWORDWINAPIThreadProc(LPVOIDlpParam){//將參數(shù)翻譯為長整數(shù)LONGnAdd=reinterpret_cast<LONG>(p//建立完全的指定文獻名(包括途徑信息)::GetTempPath(MAX_PATH,szFllName);//獲得途徑//打開文獻對象HANDLEhFile=::CreatszFulIName,//文獻的完全名稱GENERIC-READ|GENERIC_WRITE//具有所有的訪問權(quán)/容許其他線程讀取NULL./一般文獻NULL);(/讀取目前數(shù)據(jù)reinterpet_cast<LPVOID>(&nVa//缺省的安全性//創(chuàng)立或打開文獻//無模板文獻//要讀取的文獻//緩沖區(qū)NULL);//緩沖區(qū)容量//無重疊I/Ostd::cout<<"read:"<<nVal/增長數(shù)值/寫回永久存儲介質(zhì)reinterpret_cast<LPCVOID>(&nVaNULL);if(dwXfer==sizeof(n{std::cout<<"write:"<<nVal/要寫入的文獻/寫入的字節(jié)數(shù)/無重疊I/O/創(chuàng)立100個線程從文獻中進行讀寫for(intnTotal=100;nTotal{/啟動線程HANDLEhThread=::CreateNULL,reinterpret_cast<LPVOID>NULL);::WaitForSingleObje/缺省的堆棧/無特殊的創(chuàng)立標(biāo)志/忽視線程id閱讀和分析程序,請回答問題:1)程序中啟動了多少個單獨的讀寫線程?2)使用了哪個系統(tǒng)API函數(shù)來創(chuàng)立線程例程?3)文獻的讀和寫操作分別使用了哪個API函數(shù)?每次運行進程時,都可看到程序中的每個線程從前面的線程中讀取數(shù)據(jù)并將數(shù)據(jù)增長,文獻中的數(shù)值持續(xù)增長。這個示例是很簡樸的通訊機制??蓪⑦@一示例用作編寫自己的文獻讀/寫代碼的模板。請注意程序中寫入之前文獻指針的重置。重置文獻指針是必要的,由于該指針在讀取結(jié)束時將處在前四個字節(jié)之后,同一指針還要用于向文獻寫入數(shù)據(jù)。假如函數(shù)向該處寫入新數(shù)值,則下次進程運行時,只能讀到本來的數(shù)值。那么:4)在程序中,重置文獻指針使用了哪一種函數(shù)?5)從輸出成果,對照分析程序,可以看出程序運行的流程嗎?請簡樸描述:首先創(chuàng)立一種線程,讀nValue的值,然后nValue值加一后,將nValue值重新寫入文獻。反復(fù)上述過程1002、演示使用映射文獻的內(nèi)存互換數(shù)據(jù)的線程/仲裁訪問的互斥體(HANDLEhMapping=reintarpret_cast<HANDLE>(I/等待對文獻的訪問:WaitForSingleObject(g_hMutexMLPVOIDpFile=:MapViewOfFile(0.//在文獻的開頭處(高32位開始{LONG*pnData=reinterpret_cast<LON/顯示新數(shù)值std::cout<<“thread”<<::GetCu<<"value:"<<(*pnData)<<std釋放文獻視圖(NULL,NULL);(LPVOIDpData=::MapView,//獲得讀寫權(quán)數(shù)據(jù)文獻//最大容量(高32位)HANDLEhMapping=::MakeSharedFileO);{0,/缺省堆棧{std::cout<<“allthreadscreated,waiting.”<<std:end;/關(guān)閉對象閱讀和分析程序,請回答:1)程序中用來創(chuàng)立一種文獻映射對象的系統(tǒng)API函數(shù)是哪個?2)在文獻映射上創(chuàng)立和關(guān)閉文獻視圖分別使用了哪一種系統(tǒng)函數(shù)?3)運行時,程序首先通過(MakeSharedFileO;)函數(shù)創(chuàng)立一種小型的文獻映射對象(hMapping),接著,使用系統(tǒng)API函數(shù)(CreateMutex();)再創(chuàng)立一種保護其應(yīng)用的互斥體(g_hMutexMapping)。然后,應(yīng)用程序創(chuàng)立100個線程,每個都容許進行同樣的進程,即:通過互斥體獲得訪問權(quán),這個操作是由語句:_WaitForSingleObject(g_hMutexMapping,INFINITE);實現(xiàn)的。再通過函數(shù)(MapVewOfFile(;)操作將視圖映射到文獻,將高32位看作有符號整數(shù),將該數(shù)值增長(即命令:++(pnData);),再將新數(shù)值顯示在控制臺上。每個線程清除文獻的視圖并在退出之前釋放互斥體的語句是ReleaseMutex(g_hMutexMapping);。當(dāng)線程完畢時,應(yīng)用程序關(guān)閉并退出。4)將程序中的語句::Sleep(500);刪除(例如在語句前面加上“/”)后,重新編譯運行,結(jié)變化嗎?為何?有變化。100個線程一閃而過,不能看清成果。由于Sleep(500)是為了放慢速度,以便觀測。請總結(jié)一下本次試驗的收獲、教訓(xùn)和感受,結(jié)合書本內(nèi)容談一下你對進程間控制的理解。通過這次試驗,我對操作系統(tǒng)中的事件和互斥體對象,以及線程同步的概念有了更清晰的理解。當(dāng)多種進程并發(fā)執(zhí)行時,若我們不指定進程之間并發(fā)的次序,則他們可以任意并發(fā),多種進程訪問同一種互斥資源時,會出現(xiàn)錯誤,或者計算成果不唯一,這時我們必須通過某種手段來同步進程間并發(fā)的次序,這便是進程間的同步問題。并且,并發(fā)執(zhí)行的進程或線程間,有時為了需要,會互相之間進行數(shù)據(jù)的互換,即進程間通信,Windows中,可以通過文獻對象在線程間發(fā)送數(shù)據(jù)。還可以使用映射文獻的內(nèi)存互換數(shù)據(jù)。試驗三存儲管理一、試驗?zāi)康耐ㄟ^試驗理解WindowsXP內(nèi)存的使用,學(xué)習(xí)怎樣在應(yīng)用程序中管理內(nèi)存,體會Windows應(yīng)用程序內(nèi)存的簡樸性和自我防護能力。學(xué)習(xí)檢查虛擬內(nèi)存空間或?qū)ζ溥M行操作;理解WindowsXP的內(nèi)存構(gòu)造和虛擬內(nèi)存的管理,進而理解進程堆和Windows為使用內(nèi)存而提供的某些擴展功能。本試驗中還以一種Linux實例程序闡明應(yīng)用程序怎樣通過系統(tǒng)調(diào)用來管理自己用的空閑內(nèi)存,目的在于加深同學(xué)對操作系統(tǒng)存儲管理內(nèi)容的理解。二、試驗環(huán)境硬件環(huán)境:計算機一臺,局域網(wǎng)環(huán)境;軟件環(huán)境:WindowsXPProfessional,LinuxRedhat9.0或Ubumtu,VisualC++6.0專業(yè)版或企業(yè)版。三、試驗內(nèi)容和環(huán)節(jié)在WindowsXP環(huán)境下,4GB的虛擬地址空間被劃提成兩個部分:低端2GB提供應(yīng)進程使用,高端2GB提供應(yīng)系統(tǒng)使用。這意味著顧客的應(yīng)用程序代碼,包括DLL以及進程使用的多種數(shù)據(jù)等,都裝在顧客進程地址空間內(nèi)(低端2GB)。//工程vmwalker#pragmacomment(lib,{return((dwTarget&dwMask)==dwMa#defineSHOWMASK(dwTarget,if(TestSet(dwTarget,PAGEvoidShowProtetion(DWORDdwTa{{/首先,獲得系統(tǒng)信息{//緩沖區(qū)/大小確實認(rèn){LPCVOIDpEnd=(PBYTE)pBlock+mbi.Reg:StrFormatByteSize(mbi.RegionSi<<std:hex<<std::setw(8)<<(DWORD)pB<<std:hex<<std::setw(8)<<(DWO<<(::strlen(szSize)==7?"(":"(")<<szSi/顯示塊的狀態(tài)if(mbi.Protect==0&&mbi.Sate!=1/除去途徑并顯示)/完全指定的文獻名稱一}C:\PrograxFilea\lierosoC:\PrograxFilea\lieroso77fcf090-77fd1880(8.00K77fd1800-7c880000(72.1MB>FreeHOAZc884088-7c887888<12.8KB>Comnitted.READVRITE.2c887808-7c889889(8.00KR>Comnittad.VRITECOPy.InageZc889000-7c91d?e?(592KB)Co2c?1de?0-7c?20008(127c9288e-7c?218ea(4.38KB)Comsitted,READONLY.Inage.Hodule:ntd11.d117c9218N?-7c99c888<588KB>Conmitt2c996888-7c9a1889(12.8KB>Connitted.REA209a1000-7c9.3880(8.00KB>Comitted.WRITECOPy.Inage2e943008-7e?b6808(76.0KB>Connitted,HEADONLY,Inage7c9b?0N?-76F0899(45.2HB716F88B?-7F6F788a<28.8KB>Committed.EXECUTE16f?800-7F7F00en(996KB)Renerved.READONLY.HappZff0000-7fd3009(204KB>ConmittedREADONLY,HappedZFFd3888-7TFdc888(36.8KZKfdc098-7Efdd?e?(4.88KB)Comnitted.READVRITE,2ffdd?80-7ffdf889(8.00KB>Freo.NOACZffdf?00-7Ffo?009(4.00KB>Comnftted.READVRITE.PelvateZffeB?08-7FF=1080(4.00KB>Connitted.HEADONLY.rfe188-7Tffuen(68.0KB>Reserved,NOACCENs,Private內(nèi)存的特性。虛擬內(nèi)存中的塊由VirtualQueryExOAPI定義成持續(xù)快或具有相似狀態(tài)(自由區(qū)、已調(diào)配區(qū)等等)的內(nèi)存,并分派以一組統(tǒng)一的保護標(biāo)志(只讀、可執(zhí)行等等)。分析運行成果按committed、reserved、free等三種虛擬地址空間分別記錄試驗數(shù)據(jù)。其中“描述”是指對該組數(shù)據(jù)的簡樸描述,例如,對下列一組數(shù)據(jù):00010000-0001<8.00KB>Committed,READWRI可描述為:具有READWRITE權(quán)限的已調(diào)配私有內(nèi)存區(qū)。將系統(tǒng)目前的自由區(qū)(free)虛擬地址空間填入表中。大小空間類型將系統(tǒng)目前的已調(diào)配區(qū)(committed)大小空間類型將系統(tǒng)目前的保留區(qū)(reserved)虛擬地址空間填入表5-8大小空間類型2.虛擬內(nèi)存操作使用。{BYTE*arFill=(BYTE*)for(DWORDdwFill=0;dwFill<dwSiz{std:cout<<"Memoryzeroadl"<<std:endl;std:cout<<"Couldnotzerom}/使用內(nèi)存分派來獲得1GB塊{LPVOIDpBlock=:malloc(c_dwGiNULL,c_dwGigabyte,/規(guī)定IGBMEM_COMMIT,/調(diào)配物理存儲PAGE_READWRITE);/對此的讀寫1 LPVOIDpBlock=::VrtuaNULL,/不指定起始地址c_dwGigabyte,//規(guī)定1GBMEM_RESERVE,/不調(diào)配物理存儲PAGE_READWRITE);/對此的讀寫LPVOIDpBlock=:VrtuaNULL,MEM_RESERVE,/不調(diào)配物理存儲PAGE_READWRITE);/對此的讀寫操作C:VProerFilcs\WicrosoftYisuslStudio\yProjceta\IIWebug\11.exoemoryzeroed對照運行成果,分析程序。為了給數(shù)據(jù)庫保留1GB的段地址空間,程序給出了內(nèi)存分派的四種措施。即程序中闡明為使用內(nèi)存分派來獲得1GB塊的程序段,該段程序試圖運用原則C中的malloc0函數(shù),從已經(jīng)已調(diào)配的小內(nèi)存區(qū)獲得內(nèi)存。從運行成果看,這種技術(shù)成功了嗎?沒有成功·第二種技術(shù)即程序中闡明為使用虛擬分派來獲取物理1GB塊的程序段,該段程序試圖通過VirtualAllocO,然后運用物理備用內(nèi)存將整個塊分派到虛擬內(nèi)存空間的任何位置。這種技術(shù)只對擁有1GB以上的RAM且均有換頁文獻的計算機可行。從運行成果看,這種技術(shù)成功了嗎?沒有成功·第三種技術(shù)即程序中闡明為使用虛擬分派來獲取虛擬1GB塊的程序段,該段程序運用VirtualAllocO,假如函數(shù)成功,則獲得大塊內(nèi)存,但不將任何物理內(nèi)存調(diào)配到此塊中。從運行成果看,這種技術(shù)成功了嗎?沒有成功·第四種技術(shù)即程序中闡明為使用虛擬分派調(diào)配來獲取虛擬1GB塊,再為其調(diào)配1MB物理存儲的程序段,該段程序保留IGB的內(nèi)存區(qū),然后將物理內(nèi)存調(diào)配給其中的很小一部分(1MB)。這就是程序簡介的處理一種假想的數(shù)據(jù)庫應(yīng)用程序的措施:保留整個塊,然后按規(guī)定在其一小部分內(nèi)進行讀操作,讓系統(tǒng)將用過的區(qū)域換頁到磁盤中。運用VirtualLock0API,Windows可用來在自己的進程空間中控制虛擬內(nèi)存的行為。這個函數(shù)與其成對的VirtualUnlockO制止或容許一塊內(nèi)存從物理RAM中換頁和換頁到頁面文獻中。這樣就會告知系統(tǒng)有一段特定的內(nèi)存區(qū)規(guī)定對顧客作出強烈的響應(yīng),因此系統(tǒng)不應(yīng)將其移出RAM。當(dāng)然,假如要將整個虛擬內(nèi)存空間鎖定,系統(tǒng)就會停留于試圖將系統(tǒng)中工作內(nèi)存的每一小塊換頁到磁盤3.虛擬內(nèi)存的分派與釋放能對的使用系統(tǒng)函數(shù)GetMeoryStatus0和數(shù)據(jù)構(gòu)造MEMORY_STATUS理解系統(tǒng)內(nèi)存和虛擬存儲空間使用狀況,會使用VirsualAlloc()函數(shù)和VirsualFree()函數(shù)分派和釋放虛擬內(nèi)存空間。//GetMemoryStatus.cpp:Definestheentrypointforthe#include"GetMemorySt#endifint_tmain(intargc,TCHAR*argv).TCHAR{printf("NowAllocate32MVrsualMemoryaBaseAddr=:VirtualAlloc(NULL,1024*1024*32,MEM_RESERVEMEM_COMMIT,PAGE;//分派虛擬內(nèi)存if(BaseAddr==NULL)printf("VirsualAllocateFail.\n");str=(char*)malloc(1printf("NowRelease32MVirsif(:VirtualFree(BaseAddr,0,MEM_RELEASE)==0)/printf("ReleaseAllocateFail\n");free(str);}{printf("\tTotalPhysicalMemoryis%dMB\n",Memlnfoprintf("\tAvailablePhysicalMemoryis%dMB\n",Memlnfo.dprintf("\tTotalPage%dMB\n",Memlnfo.dwTotalPaprintf("\tAvailablePage%dMB\n",Memlnfo.dwAvailPageFile/(1024*1024));printf("\tTotalVirtualMemoryis%dMB\n",Memlnfo.dwprintf("\tAvailableVirsualmemoryis%dMB\n",Memlnfo.dwAvailVirtprintf("\tMemoryLoadis%d%%\n\n"}環(huán)節(jié)1:在VC6.0環(huán)境下選擇Wn32ConsoleApplication建立一種控制臺工程文獻,選擇Anapplication環(huán)節(jié)2:編輯并編譯完畢后,單擊“Build”菜單中的“BuildGetMemoryStatus.exe”命令,建立GetMemoryStatus.exe可執(zhí)行文獻。操作能否正常進行?假如不行,則也許的原因是什么?可以正常運行環(huán)節(jié)3:在工具欄單擊“ExecuteProgram”按鈕,執(zhí)行GetMemoryStatus.cpp.exe程序。分析程序GetMemoryStatus.cpp的運行成果1)請描述運行成果(假如運行不成功,則也許的原因是什么?):AvailablePhysicalHenoTotalUirtualHemoryHouRelease32MVirsualMemoryand2MPhysiTotalUirtualHemory2)根據(jù)運行輸出成果,若要變化分派和回收的虛擬內(nèi)存和物理內(nèi)存的大小,要變化程序代碼的語句,分別為BaseAddr=:VirtualAlloc(NULL,1024*1024*32,MEM_RESERVEMEM_COMMIWRITE);//分派虛擬內(nèi)存if(BaseAddr==NULL)printf("VirsualAllocateFail.\n");printf("NowRelease32MVif(::VirtualFree(BaseAddr,0,MEM_RELEASE)==0)printf("ReleaseAllocateFail.\n");free(str);3)根據(jù)運行輸出成果,對照分析4-2程序,可以看出程序運行的流程嗎?請簡樸描述:第二部分Linux顧客程序的內(nèi)存管理現(xiàn)代操作系統(tǒng)容許多種程序同步運行,因此,內(nèi)存中需要同步寄存這些程序。操作系統(tǒng)采用的存儲管理方案重要有分區(qū)式存儲管理、分頁式存儲管理、分段式存儲管理和段頁式存儲管理等。本試驗以一種Linux實例程序闡明應(yīng)用程序怎樣通過系統(tǒng)調(diào)用來管理自己用的空閑內(nèi)存,目的在于理解顧客程序分派內(nèi)存以及回收所用內(nèi)存的程序過程,加深對操作系統(tǒng)存儲管理機制的理解。本試驗實例由my-malloc.h、my-malloc.c和test.c三個文獻構(gòu)成。為閱讀程序以便,對其中的重要函數(shù)作了闡明,同學(xué)們可結(jié)合程序注釋理解該程序。本試驗程序重要定義了一種描述自由存儲塊的構(gòu)造,每一種自由塊都包括塊的大小、指向下一塊的指針以及塊區(qū)自身,所有的自由塊以地址增長次序排列,并用鏈表鏈接起來。這一鏈表是本程序維護的一種空閑區(qū)域,對于操作系統(tǒng)的目前記錄來說是已分出去的區(qū)域。由于本程序是運行在顧客態(tài)的程序。環(huán)節(jié)1:單擊紅帽子,在“GNOME協(xié)助”菜單中單擊“附件”-“文本編輯器”命令,在文本編輯中鍵入清單5-4程序并保留為my-malloc.h。清單5-4my-malloc.h文獻/*foralignmenttolongboundar/*nextblockifonFreelist*//*sizeofthisblock*//*forcealignmentofblocks*/#defineNALLOC10/*minimum#unitstorequestaticHeader*morecore(unsvoid*Malloc(unsignedstaticHeaderbase;/#empylistaticHeader*free_list=NULL;/*startoffr/*Malloc:general-purposestorageallocator*/void*Malloc(unsignedintnbytes){nunits=(nbytes+sizeof(Header)-1)/sizeof(Headif((prev=free_list)==NULL){/*nofreelistyet*/base.s.next=free_list=prev=&b}for(p=prev->s.next;;prev=p,pif(p->s.size>=nunits){/*bigenough*/if(p>s.size==nunits)prev->s.next=p>s.neif((p=morecore(nunits}staticHeader*morecore(unprintf("sbrk:%X-%X\n",cp,cp+nu*sizof(Header));if(cp==(char*)-1)}bp=(Header*)ap-1;/*pointtoblockheader*/for(p=free_list;!(bp>p&&bp<p>s.nextif(p>=p->s.next&&(bp>plbp<pbreak;if(bp+bp->s.size==p->s.next){/*jointouppernbr*/bp->s.size+=p>s.next->s.sbp->s.next=p->s.next->s.neif(p+p>s.size==bp){}}printf("base:%X,base.next:%X,base.next,next:%X,free:%x\n",&base.s.next,base.s.next->s.next,free_lifor(p=&base;p->s.next!=free_lprintf("block%d,size=%d",I,p->s.si}p[i]=(char*)Malloc(printf(“malloc%d,%X\n”,i,p[i}printf("free%d\n",i}環(huán)節(jié)4:編譯。成功解。試驗四輸入輸出管理程序中捕捉鼠標(biāo),從而加深理解WindowsXP輸入/輸出處理技術(shù)。在本試驗中,著重理解磁盤的物理組織,以及怎樣通過顧客態(tài)的程序直接調(diào)用磁盤VOAPI函數(shù)(DeviceloControl)根據(jù)輸入的驅(qū)動器號讀取驅(qū)動器中磁盤的基本信息。硬件環(huán)境:計算機一臺,局域網(wǎng)環(huán)境:軟件環(huán)境:WindowsXPProfessional,LinuxRedhat9.0或Ubumtu,VisualC++6.0專業(yè)版或企業(yè)版。三、試驗內(nèi)容和環(huán)節(jié)一臺計算機擁有大量的輸入設(shè)備,而鼠標(biāo)和鍵盤是其中最常用的輸入設(shè)備盤處理就像使用VisualC++的ClassWizard在MFC程序中添加一兩個消息響應(yīng)函數(shù)同樣簡樸。在本試驗中,我們通過一種應(yīng)用程序示例來討論鼠標(biāo)編程技巧,理解怎樣響應(yīng)鼠標(biāo)程序中捕捉鼠標(biāo)。該程序的實例代碼在試驗指導(dǎo)書外另附。環(huán)節(jié)2:在“開始”菜單中單擊“程序”“MicrosoftVisualStudio6.0”-“MicrosoftVisualC++6.0”環(huán)節(jié)3:在File菜單單擊OpenWorkspace.…命令,在“OpenWorkspace”對話框中找到試驗代碼文獻夾并打開試驗文獻Mouse.dsw。環(huán)節(jié)4:單擊Build菜單中的BuildMouse.exe命令,系統(tǒng)對程序進行編譯并建立可執(zhí)行文獻。操作能否正常進行?假如不行,則也許的原因是什么?可以正常運行環(huán)節(jié)5:在工具欄單擊“ExecuteProgram”按鈕,執(zhí)行Mouse.exe程序,響應(yīng)鼠標(biāo)消息。Mouse示例程序演示了怎樣截取和響應(yīng)鼠標(biāo)消息。運行這個程序,就會顯示一種主窗口。最初窗口是在鼠標(biāo)通過窗口時單擊鼠標(biāo)左鍵,窗口中不僅出現(xiàn)WM_LBUTTONDOWN和WM_LBUTTONUP消息,并且顯示事件發(fā)生的坐標(biāo)。單擊鼠標(biāo)右鍵,再次出現(xiàn)上述狀況。請記錄:Y:164:鼠標(biāo)移動到指定位置:單擊鼠標(biāo)左鍵:釋放鼠標(biāo)左鍵:單擊鼠標(biāo)右鍵:釋放鼠標(biāo)右鍵Mouse應(yīng)用程序也舉例闡明了鼠標(biāo)捕捉的技巧。有些時候需要應(yīng)用程序接受鼠標(biāo)消息,甚至鼠標(biāo)不在應(yīng)用程序客戶區(qū)時,也有這個規(guī)定。例如在一種畫圖程序中,顧客在窗口中畫線時一直接住鼠標(biāo)左鍵。假如一種顧客碰巧把鼠標(biāo)指針移到畫圖應(yīng)用程序的窗口之外,應(yīng)用程序必須繼續(xù)接受鼠標(biāo)消息。否則顧客在窗口之外釋放鼠標(biāo)按鈕,應(yīng)用程序?qū)o法懂得顧客與否仍舊在畫圖。為理解鼠標(biāo)捕捉的工作狀況,可把指針移動到Mouse應(yīng)用程序的客戶區(qū),然后一直按住鼠標(biāo)右鍵,在屏幕上任意移動鼠標(biāo)。雖然鼠標(biāo)移動到窗口外,窗口繼續(xù)接受鼠標(biāo)消息。在不按住鼠標(biāo)右鍵移動鼠標(biāo)時,鼠標(biāo)指針離開了應(yīng)用程序的客戶區(qū)的狀況下,應(yīng)用程序停止接受鼠標(biāo)消息。注意到,在按住鼠標(biāo)右鍵移動到客戶區(qū)外面左側(cè)時,WM_MOUSEMOVE的坐標(biāo)值目前為負(fù)的。這是由于何?超過客戶區(qū)域后為負(fù)值環(huán)節(jié)7:測試Mouse應(yīng)用程序由于在窗口的視圖類CMouseView中定義了消息響應(yīng)函數(shù),Mouse應(yīng)用程序會響應(yīng)鼠標(biāo)消息。作為MFC編程的一條規(guī)則,CMouseVew使用消息映射把消息和消息響應(yīng)函數(shù)聯(lián)絡(luò)起來。下面的代碼顯示CMouseVew類怎樣定義它的消息映射。每一種包括消息映射體的宏把鼠標(biāo)消息和合適的消息處理程序有關(guān)聯(lián)。例如,當(dāng)窗口接受WM_MOUSEMOVE消息時,ON_WMMOUSEMOVE宏告知MFC調(diào)用OnMouseMove(O函數(shù)。同樣,當(dāng)窗口接受WM_LBUTTONDOWN消息時,消息映射告知MFC調(diào)用OnLButtonDownO函數(shù)。出目前Mouse應(yīng)用程序窗口的文本由視圖類消息響應(yīng)函數(shù)來顯示。例如,下列代碼顯示了OnMouseMove()函數(shù):(wsprintf(str,"X:%dY:%d",!在鼠標(biāo)指針移動到應(yīng)用程序窗口時,Mouse應(yīng)用程序接受這些消息流。作為函數(shù)的第二個參數(shù)傳送的CPoint對象包括了在事件發(fā)生時鼠標(biāo)指針?biāo)谖恢玫男畔?。OnMouseMove從CPoint對象中建立一種顯示的字符串,并且在應(yīng)用程序的窗口中顯示這個字符串。OnLButtonDownO、OnLButtonUpO、OnLButtonDbIClkO和OnRButtonDbIClkO函數(shù)工作狀況相似,把CPoint對象轉(zhuǎn)變?yōu)樵趹?yīng)用程序窗口中顯示的顯示字符串。環(huán)節(jié)8:讀懂WindowsXP獲取鼠標(biāo)消息的函數(shù)以及對事件處理的代碼,在此基礎(chǔ)上修改原程序段,產(chǎn)生新的響應(yīng)事件:1)修改鼠標(biāo)左鍵單擊后的事件,使在單擊鼠標(biāo)后,在單擊的位置上出現(xiàn)“你好”字樣。2)修改鼠標(biāo)右鍵單擊釋放的事件,使在單擊鼠標(biāo)按下的位置出現(xiàn)“再”字,在釋放右鍵的位置上出現(xiàn)“見”字。操作與否成功?假如不行,則也許的原因是什么?可運行成功見再環(huán)節(jié)9:單擊窗口右上角的“關(guān)閉”按鈕,結(jié)束第二部分磁盤I/0API函數(shù)應(yīng)用背景知識有關(guān)的API簡介LPVOIDlplnBuffer,DWORDnlnBufferSize,LPVOID1pOutBuffer,DWORDnOutBufferSiz.nInBufferSize:指定1pInBustructDISK_GEOMETRY(unsignedbytesPerSector;unsignedsectorsPerTrack;unsignedheads;unsignedcylindHANDLECreateFile(LPCTSDWORDdwShareMode,LPSECURITY_ATTRIBUTDWORDdwCreationDisposition,此參數(shù)可認(rèn)為下列值的任意一種組合值:.0:指定對象的查詢訪問權(quán)限,一種應(yīng)用程序可以不通過訪問設(shè)備來查詢設(shè)備屬性。.dwCreationDisposition:指定對存在的文獻采用哪種措施,且當(dāng)文獻不存在時采用哪種措施,此函數(shù)必須是下列值中的一種:.CREAT_NEW:創(chuàng)立一種新文獻,假如文獻存在,則函數(shù)調(diào)用失敗。.OPEN_EXISTING:打開文獻,假如文獻不.TRUNCATE_EXISTING:打開文獻,一旦文獻打開,就被刪截掉,從而使文.dwFlagsAndAttributes:指定文獻屬性和標(biāo)志,該參數(shù)可取諸多種組合,如下示三種:指定事件被設(shè)置為發(fā)信號狀態(tài)。.:引導(dǎo)系統(tǒng)打開沒有瞬間緩沖或緩存的文獻,當(dāng)與結(jié)合時,標(biāo)志給出最大的準(zhǔn)時間次序的操作,由于I/0不依托內(nèi)存管理器的時間次序的操作,不過,由于數(shù)據(jù)沒有在緩存中,某些I/0操作將長某些。.:表明文獻從開頭到結(jié)尾按次序被訪問。使用它,系統(tǒng)可優(yōu)化文獻緩存。訪問方式讀大文獻的應(yīng)用程序,指定此標(biāo)志可以增長它的性能。返回值:假如函數(shù)調(diào)用成功,返回值為指向指定文獻的打開句柄:假如函數(shù)調(diào)用失敗,返回值為試驗?zāi)康谋驹囼炛赜诶斫獯疟P的物理組織,以及怎樣通過顧客態(tài)的程序直接調(diào)用磁盤VOAPI函數(shù)(DeviceIoControl)根據(jù)輸入的驅(qū)動器號讀取驅(qū)動器中磁盤的基本信息,在WindowsXP環(huán)境進行。structDisk//有關(guān)Dis{voidmain(void){disk=physicDisk(Driv}{I,//共享的權(quán)限{}Result=DeviceloControl(NULL{}程序的成果aa盤所在磁盤總共有2880個扇區(qū)f盤有:如輸入磁盤號為c,顯示的磁盤信息是整個硬盤信息,而不是c盤分區(qū)的信息。如輸入磁盤號為d,顯示的磁盤信息與如輸入磁盤號為c顯示的磁盤信息相似。用磁盤I/0API函數(shù)讀出的磁盤信息是從硬盤的主引導(dǎo)區(qū)得到。讓揚聲器按指定的長度和音頻發(fā)聲#defineDEFAULT_LEN/默認(rèn)不反復(fù)發(fā)聲/同樣以微秒為單位/發(fā)聲長度,以微秒為單位反復(fù)的次數(shù)/打印協(xié)助信息并退出{printfcUsage:nt%s[-ffrequency][-Ilength][-rreps][-ddelay]\n",executable_}{(intfreq=atoi((++if((freq<=0)|(freq>fprintf(stderr,"Badparameter:frequ/發(fā)聲的時間長度fprintf(stderr,"Badparameterlengthmustbe>=0'n");if((console_fd=open("/dev/console",0_WRON[fprintf(stderr,"Failedtoopenconsole.n");/真正開始讓揚聲器發(fā)聲(usleep(1000*parms.length);Ⅱ等ioctl(console_fd,KIOCSOUND,0);停止發(fā)聲usleep(1000*pams.delay);/等待…/反復(fù)播放)運行成果(假如運行不成功,則也許的原因是什么?):發(fā)出了一種MI音,發(fā)音時長1秒,發(fā)了一次,隔了5秒發(fā)出的合適調(diào)整參數(shù)的值,看看聲音有何變化。把-1的參數(shù)翻了一倍,-r的參數(shù)翻了2倍,發(fā)出了一種mi音,發(fā)音時長為2秒,發(fā)了4次,每隔5秒四、試驗總結(jié)試驗五文獻系統(tǒng)錄。三、試驗內(nèi)容和環(huán)節(jié)1.文獻信息命令環(huán)節(jié)1:開機,登錄進入GNOME。環(huán)節(jié)2:訪問命令行。環(huán)節(jié)3:使用控制字符執(zhí)行特殊功能。Crl+D:表達文獻的末尾或者退出。Crl+D用于退出某些Linux工具程序(be、write等),退出一1)在shell提醒符下鍵入be,啟動基本的計算器工具程序。2)把兩個數(shù)字相乘(鍵入:458*594,然后按回車鍵)。當(dāng)使用計算器的時候,你的提醒符是什么?Copyright1991-1994,1997,1998,,,FreeSoftwareFounda·一種擦除決定不執(zhí)行的命令行的快捷方式?!ぜ偃绲卿浀揭环N遠程系統(tǒng),退格鍵不起作用?!に梢员WC在登錄的時候,從一種“空”的顧客帳號和口令輸入開始?!び捎谠诳诹钶斎氲臅r候看不見它們,當(dāng)懂得自己鍵入了錯誤字符的時候,使用Crl+U擦除密碼,重新開始輸入。假如輸入一種命令,如Is-R/,有時候,會在按下回車鍵之前想擦除命令行。輸入一種命令,在接下回車鍵執(zhí)行命令之前按下Crl+U。成果是什么?輸入的命令被消除了環(huán)節(jié)4:使用file命令確定文獻類型。在Linux系統(tǒng)中可以找到許多類型的文獻。文獻類型可以通過使用file命令來確定。當(dāng)一種顧客試圖打開或閱讀一種文獻的時候,這個信息很重要。確定文獻類型可以協(xié)助一種顧客決定使用哪個程序或命令來打開這個文獻。這個命令的輸出最常見的是如下幾種:文本文獻、可執(zhí)行文獻或數(shù)據(jù)文獻。1)文本文獻:包括ASCII或英語文本、命令文本和可執(zhí)行的shell腳本。這種類型的文獻可以使用cat或more命令讀取,可以使用vi或其他文本編輯器編輯。單擊紅帽子,在“GNOME協(xié)助”菜單中單擊“輔助設(shè)施”-“TextEditor”命
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海工會管理職業(yè)學(xué)院《圖形與圖像處理》2023-2024學(xué)年第一學(xué)期期末試卷
- 網(wǎng)絡(luò)管理員技能鑒定測試題(附參考答案)
- 幼兒園冬至集體課程設(shè)計
- 聲樂培訓(xùn)行業(yè)發(fā)展趨勢報告
- 早教數(shù)理課特色課程設(shè)計
- 電氣工程師供配電練習(xí)
- 加強中小學(xué)科學(xué)實驗教學(xué)的實效性
- 廣西xx工業(yè)廢鹽資源化利用項目可行性研究報告
- 平安夜圣誕節(jié)介紹活動方案326
- 未來救護車課程設(shè)計
- 工程監(jiān)理招聘面試題及回答建議(某大型集團公司)2024年
- 腰椎間盤突出癥課件(共100張課件)
- 中層管理干部團隊-執(zhí)行力與領(lǐng)導(dǎo)力提升培訓(xùn)課件
- 明史十講學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 下肢康復(fù)機器人課件
- 文化地理學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024年中國產(chǎn)蛋鴨濃縮料市場調(diào)查研究報告
- 2024-2030年全球及中國數(shù)據(jù)科學(xué)平臺行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告
- 2023-2024學(xué)年部編版道德與法治三年級上冊期末檢測題及答案(共3套)
- 職業(yè)健康及環(huán)境安全培訓(xùn)(共70張課件)
- 多源異構(gòu)日志關(guān)聯(lián)與融合
評論
0/150
提交評論