操作系統(tǒng)實驗報告4_第1頁
操作系統(tǒng)實驗報告4_第2頁
操作系統(tǒng)實驗報告4_第3頁
操作系統(tǒng)實驗報告4_第4頁
操作系統(tǒng)實驗報告4_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng) 實驗報告實驗序號:4實驗項目名稱:進程控制學號1207122219姓名鄺沃佳專業(yè)、班軟金二班實驗地點1-418指導教師李遠敏實驗時間2014/10/21一、 實驗目的及要求(1) 通過對WindowsXP進行編程,來熟悉和了解系統(tǒng)。(2) 通過分析程序,來了解進程的創(chuàng)建、終止。二、實驗設備(環(huán)境)及要求(1) 一臺WindowsXP操作系統(tǒng)的計算機。(2) 計算機裝有Microsoft Visual Studio C+6.0專業(yè)版或企業(yè)版。(3) CreateProcess()調(diào)用:創(chuàng)建一個進程。(4) ExitProcess()調(diào)用:終止一個進程。三、實驗內(nèi)容與步驟(1)編程一 利

2、用CreateProcess()函數(shù)創(chuàng)建一個子進程并且裝入畫圖程序(mspaint.exe)。閱讀該程序,完成實驗任務。源程序如下: # include # include int main(VOID) STARTUPINFO si; PROCESS INFORMATION pi; ZeroMemory(&si,sizeof(si); Si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi); if(!CreateProcess(NULL, “c: WINDOWSsystem32 mspaint.exe”, NULL, NULL, FALSE, 0, NULL,

3、NULL, &si,&pi) fprintf(stderr,”Creat Process Failed”);return 1;WaitForSingleObject(pi.hProcess,INFINITE);Printf(“child Complete”);CloseHandle(pi.hProcess);CloseHandle(pi hThread); 修改后:#include #include int main(VOID) STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si,sizeof(si);si.cb=sizeof(si);Ze

4、roMemory(&pi,sizeof(pi);if(!CreateProcess(NULL,c:WINDOWSsystem32mspaint.exe, NULL,NULL,FALSE,0,NULL, NULL,&si,&pi)fprintf(stderr,Creat Process Failed);return -1; WaitForSingleObject(pi.hProcess,INFINITE);printf(child Complete);CloseHandle(pi.hProcess);CloseHandle(pi.hThread); 在“命令提示符”窗口運行CL命令產(chǎn)生可執(zhí)行程序

5、4-1.exe: C: CL 4-1.cpp 實驗任務:寫出程序的運行結(jié)果。 4正在運行的進程 (2)、編程二 下面給出了一個使用進程和操作系統(tǒng)版本信息應用程序(文件名為4-5.cpp)。它利用進程信息查詢的API函數(shù)GetProcessVersion()與GetVersionEx()的共同作用。確定運行進程的操作系統(tǒng)版本號。閱讀該程序并完成實驗任務。 #include #include/利用進程和操作系統(tǒng)的版本信息的簡單示例Void main() /提取這個進程的ID號 DWORD dwIdThis=:GetCurrentProcessId(); /獲得這一進程和報告所需的版本,也可以發(fā)送0

6、以便指明這一進程DWORD dwVerReq=:GetProcessVersion(dwIdThis);WORD wMajorReq=:(WORD)dwVerReq16);WORD wMinorReq=:(WORD)dwVerReq & oxffff);std:cout ”Process ID:” dwIdThis ”,requires OS:” wMajorReq wMinorReq std:endl;/設置版本信息的數(shù)據(jù)結(jié)構(gòu),以便保存操作系統(tǒng)的版本信息OSVERSIONINFOEX osvix;:ZeroMemory(&osvix,sizeof(osvix);Osvix.dwOSVersi

7、onInfoSize=sizeof(osvix);/提取版本信息和報告:GetVersionEx(reinterpret cast(&osvix);Std:cout ”Running on OS:” osvix.dwMajorVersion ”.” osvix.dwMinorVersion =5 /改變優(yōu)先級:SerPriorityClass(:GetCurrentProcess() /利用這一進程 HIGH PRIORITY CLASS); /改變?yōu)閔igh/報告給用戶Std:cout ”Task Manager should now now indicate this” “process

8、is high priority.” std:endl;修改后:#include#include/利用進程和操作系統(tǒng)的版本信息的簡單示例void main()/提取這個進程的ID號DWORD dwIdThis=:GetCurrentProcessId();/獲得這一進程和報告所需的版本,也可以發(fā)送0以便指明這一進程DWORD dwVerReq=:GetProcessVersion(dwIdThis);WORD wMajorReq=(WORD)dwVerReq16);WORD wMinorReq=(WORD)dwVerReq&0xffff);std:coutProcess ID:dwIdThis

9、 ,requires OS:wMajorReqwMinorReqstd:endl;/設置版本信息的數(shù)據(jù)結(jié)構(gòu),以便保存操作系統(tǒng)的版本信息OSVERSIONINFOEX osvix;:ZeroMemory(&osvix,sizeof(osvix);osvix.dwOSVersionInfoSize=sizeof(osvix);/提取版本信息和報告:GetVersionEx(reinterpret_cast(&osvix);std:coutRunning on OS:osvix.dwMajorVersion.osvix.dwMinorVersion=5)/改變優(yōu)先級:SetPriorityClass

10、(:GetCurrentProcess(), /利用這一進程HIGH_PRIORITY_CLASS); /改變?yōu)閔igh/報告給用戶std:coutTask Manager should now now indicate thisprocess is high priority.std:endl;實驗參考:在Visual C+窗口的工具欄中單擊“打開”按鈕,在“打開“對話框中找到并打開4-2.cpp源程序。單擊Build菜單中的Compile 4-2.cpp命令,再單擊“是”按鈕確認。系統(tǒng)對4-2.cpp源程序進行編譯。編譯完成后,單擊Build菜單中的Build 4-2.exe命令,建立4-

11、2.exe可執(zhí)行文件。在工具欄單擊Execute Program(執(zhí)行程序)按鈕,執(zhí)行4-2.exe程序。實驗任務:寫出程序運行后的以下幾項結(jié)果。當前PID信息 1628 。當前操作系統(tǒng)版本 Running on OS:5.1 。系統(tǒng)提示信息 Task Manager should now now indicate thisprocess is high priority 。5、終止進程(3)編程三 下面給出了一個終止進程的應用程序(文件名為4-3.cpp),它先創(chuàng)建一個子進程,然后命令它發(fā)出“自殺彈”互斥體去終止自身的運行。閱讀該程序并完成實驗任務。 #include #include #i

12、nclude satic LPCTSTR g szMutexName=”w2kdg.ProcTerm.mutex.Suicide”;/創(chuàng)建當前進程的克隆進程的簡單方法Void StartClone() /提取當前可執(zhí)行文件的文件名 TCHAR szFilenameMAX PATH :GetModuleFileName(NULL,szFilename,MAX PATH); /格式化用于子進程的命令行,指明它是一個EXE文件和子進程 TCHAR szCmdLineMAX PATH; :sprintf(szCmdLine,”%s”child”,szFilename); /子進程的啟動信息結(jié)構(gòu) STA

13、RTUPINFO si; :ZeroMemory(reinterpret cast(&si),sizeof(si); si.cb=sizeof(si); /應當是此結(jié)構(gòu)的大小 /返回的用于子進程的進程信息 PROCESS INFORMATION pi; /用同樣的可執(zhí)行文件名和命令行創(chuàng)建進程,并指明它是一個子進程 BOOL bCreateOK=:CreateProcess( SzFilename, /產(chǎn)生的應用程序名稱(本EXE文件) SzCmdLine, /告訴人們這是一個子進程的標志 NULL, /用于進程的默認的安全性 NULL, /用于線程的默認安全性 FALSE, /不繼承句柄 CR

14、EATE NEW CONSOLE, /創(chuàng)建新窗口,使輸出更直觀 NULL, /新環(huán)境 NULL, /當前目錄 &si, /啟動信息結(jié)構(gòu) &pi); /返回的進程的信息 /釋放指向子進程的引用 if(bCreateOK) :CloseHandle(pi.hProcess); :CloseHandle(pi.hThread); Void Parent() /創(chuàng)建“自殺”互斥程序體 HANDLE hMutexSuicide=:CreatgeMutex( NULL, /默認的安全性 TRUE, /最初擁有的 g szMutexName); /為其命名 if(hMutexSuicide !=NULL)

15、/創(chuàng)建子進程 std:cout ”Creating the child process.” std : endl; :StartClone(); /暫停 :sleep(5000); /指令子進程“殺”掉自身 std:cout ”Telling the child process to quit.” std:endl; :ReleaseMutex(hMutexSuicide); /消除句柄 :CloseHandle(hMutexSuicide); Void Child() /打開“自殺”互斥體 HANDLE hMutexSuicide=:OpenMutex( SYNCHRONIZE, /打開用于

16、同步 FALSE, /不需要向下傳遞 g szMutexName); /名稱 if ( hMutexSuicide !=NULL) /報告正在等待指令 Std:cout ”Child waiting for suicide instructions.” std:endl; :WaitForSingleObject(hMutexSuicide,INFINITE); /報告準備好終止,消除句柄 Std:cout ”Child quiting.” 1 & & :strcmp(argv1,”child”)=0) Child(); else Parent(); Return 0; 修改后:#includ

17、e #include #include static LPCTSTR g_szMutexName=w2kdg.ProcTerm.mutex.Suicide;/創(chuàng)建當前進程的克隆進程的簡單方法void StartClone() /提取當前可執(zhí)行文件的文件名 TCHAR szFilenameMAX_PATH; :GetModuleFileName(NULL,szFilename,MAX_PATH); /格式化用于子進程的命令行,指明它是一個EXE文件和子進程 TCHAR szCmdLineMAX_PATH; :sprintf(szCmdLine,%schild,szFilename); /子進程的

18、啟動信息結(jié)構(gòu) STARTUPINFO si; :ZeroMemory(reinterpret_cast(&si),sizeof(si); si.cb=sizeof(si); /應當是此結(jié)構(gòu)的大小 /返回的用于子進程的進程信息 PROCESS_INFORMATION pi; /用同樣的可執(zhí)行文件名和命令行創(chuàng)建進程,并指明它是一個子進程 BOOL bCreateOK=:CreateProcess( szFilename, /產(chǎn)生的應用程序名稱(本EXE文件) szCmdLine, /告訴人們這是一個子進程的標志 NULL, /用于進程的默認的安全性 NULL, /用于線程的默認安全性 FALSE,

19、 /不繼承句柄 CREATE_NEW_CONSOLE, /創(chuàng)建新窗口,使輸出更直觀 NULL, /新環(huán)境 NULL, /當前目錄 &si, /啟動信息結(jié)構(gòu) &pi); /返回的進程的信息 /釋放指向子進程的引用 if(bCreateOK) :CloseHandle(pi.hProcess); :CloseHandle(pi.hThread); void Parent() /創(chuàng)建“自殺”互斥程序體 HANDLE hMutexSuicide=:CreateMutex( NULL, /默認的安全性 TRUE, /最初擁有的 g_szMutexName); /為其命名 if(hMutexSuicide

20、 !=NULL) /創(chuàng)建子進程 std:coutCreating the child process.std:endl; :StartClone(); /暫停 :Sleep(5000); /指令子進程“殺”掉自身 std:coutTelling the child process to quit.std:endl; :ReleaseMutex(hMutexSuicide); /消除句柄 :CloseHandle(hMutexSuicide); void Child() /打開“自殺”互斥體 HANDLE hMutexSuicide=:OpenMutex( SYNCHRONIZE, /打開用于同

21、步 FALSE, /不需要向下傳遞 g_szMutexName); /名稱 if ( hMutexSuicide !=NULL) /報告正在等待指令 std:coutChild waiting for suicide instructions.std:endl; :WaitForSingleObject(hMutexSuicide,INFINITE); /報告準備好終止,消除句柄 std:coutChild quiting.1&:strcmp(argv1,child)=0) Child(); else Parent(); return 0; 分析:程序4-3.cpp說明了一個進程從“生”到“死”的整個一生,第一次執(zhí)行時,它創(chuàng)建一個子進程,其行為如同“父親”。在創(chuàng)建子進程之前,先創(chuàng)建一個互斥的內(nèi)核對象,其行為對于子進程來說,如同一個“自殺彈”。當創(chuàng)建子進程時,就打開了互斥體并在其他線程中進行別的處理工作,同時等待著父進程使用ReleaseMutex()API發(fā)出“死亡”信號。然后用Slee

溫馨提示

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

評論

0/150

提交評論