實驗創(chuàng)建進程_第1頁
實驗創(chuàng)建進程_第2頁
實驗創(chuàng)建進程_第3頁
實驗創(chuàng)建進程_第4頁
實驗創(chuàng)建進程_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

操作系統(tǒng)試驗

創(chuàng)建進程實驗創(chuàng)建進程第1頁學(xué)會經(jīng)過基本W(wǎng)indows進程控制函數(shù),由父進程創(chuàng)建子進程。實驗?zāi)繉嶒瀯?chuàng)建進程第2頁我們設(shè)計一個應(yīng)用程序時,有時候需要另外一段代碼做一些其它工作。方法以下:一、函數(shù)調(diào)用或者子程序弊端:我們能夠用函數(shù)調(diào)用或者子程序,不過我們調(diào)用函數(shù)之后,只能等函數(shù)返回;二、在進程內(nèi)創(chuàng)建一個新線程弊端:不過假如在一個復(fù)雜應(yīng)用系統(tǒng)中,我們有可能不慎改寫了進程地址空間中一些數(shù)據(jù)(比如一些引用數(shù)據(jù)),造成其它工作不能正確地進行。實驗創(chuàng)建進程第3頁三、創(chuàng)建新進程(子進程)所以當(dāng)我們需要一些工作同時進行,而且希望保護它們運行地址空間時,一個很好地方法是創(chuàng)建一個新進程來執(zhí)行需要同時進行工作。實驗創(chuàng)建進程第4頁假設(shè)現(xiàn)在有這么一個工作,需要計算1——100和,還需要做一個工作是讀寫文件。我們能夠讓父進程計算,創(chuàng)建一個子進程實現(xiàn)讀寫文件。主要工作:1、首先由父進程創(chuàng)建子進程2、讓子進程創(chuàng)建一個文件并寫入數(shù)據(jù),子進程寫文件過程中,父進程繼續(xù)執(zhí)行計算工作3、等子進程執(zhí)行完以后,父進程讀取文件內(nèi)容輸出,實現(xiàn)進程協(xié)同工作。試驗內(nèi)容實驗創(chuàng)建進程第5頁父進程框架voidmain(){//為創(chuàng)建進程做準(zhǔn)備工作//創(chuàng)建子進程If(創(chuàng)建失?。┓祷谽lse(創(chuàng)建成功)//執(zhí)行計算1——100和//等子進程執(zhí)行完,讀取子進程文件內(nèi)容,并輸出。}程序框架實驗創(chuàng)建進程第6頁子進程框架voidmain(){//創(chuàng)建文件If(失敗)返回Else(成功)//向文件寫入數(shù)據(jù)//讀取文件內(nèi)容輸出}實驗創(chuàng)建進程第7頁BOOLCreateProcess(LPCTSTRlpApplicationName,//指定可執(zhí)行程序名LPTSTRlpCommandLine,//命令行字符串,可認(rèn)為NULLLPSECURITY_ATTRIBUTESlpProcessAttributes,//新進程對象安全屬性LPSECURITY_ATTRIBUTESlpThreadAttributes,//新進程對應(yīng)線程安全屬性BOOLbInheritHandles,//指定父進程對象句柄是否能被子進程繼承DWORDdwCreationFlags,//指定創(chuàng)建進程附加標(biāo)記,即指定新創(chuàng)建進程特征LPVOIDlpEnvironment,//指定新進程使用環(huán)境,NULL表示同父進程環(huán)境LPCTSTRlpCurrentDirectory,//指定子進程當(dāng)前路徑,NULL表示與父進程路徑相同LPSTARTUPINFOlpStartupInfo,//指定新進程主窗口怎樣顯示LPPROCESS_INFORMATIONlpProcessInformation//作為返回值使用,是一個指針);父進程創(chuàng)建子進程

用CreateProcess函數(shù)來創(chuàng)建一個新進程實驗創(chuàng)建進程第8頁當(dāng)調(diào)用CreateProcess時,系統(tǒng)所做工作:1、首先,系統(tǒng)創(chuàng)建一個進程內(nèi)查對象,其初始使用計數(shù)為1。(進程內(nèi)查對象并不代表進程本身,而是操作系統(tǒng)用來管理這個進程一個數(shù)據(jù)結(jié)構(gòu)。)實驗創(chuàng)建進程第9頁2、然后,系統(tǒng)為新進程創(chuàng)建一個虛擬地址空間,并將可執(zhí)行文件(和全部必要DLL)代碼及數(shù)據(jù)加載到進程地址空間。3、最終,系統(tǒng)為新進程創(chuàng)建一個根本程內(nèi)查對象(使用計數(shù)為1)(線程內(nèi)查對象是操作系統(tǒng)用來管理線程數(shù)據(jù)結(jié)構(gòu)。)實驗創(chuàng)建進程第10頁系統(tǒng)做完這些工作以后,新進程根本程就開始執(zhí)行運行時開啟代碼,在開啟代碼中會調(diào)用應(yīng)用程序main函數(shù),這么,新進程就從main函數(shù)開始執(zhí)行。假如調(diào)用CreateProcess函數(shù)后,系統(tǒng)成功創(chuàng)建了新進程而且創(chuàng)建了其根本程,則系統(tǒng)返回TRUE,不然返回FALSE。實驗創(chuàng)建進程第11頁討論CreateProcess參數(shù)。LPCTSTRlpApplicationNamelpApplicationName參數(shù)指定新進程要使用可執(zhí)行文件名稱。可以是完整路徑和文件名,也可以是部分名稱。注意一定要加上擴展名“.exe”。在此次實驗中,使用全路徑和文件名。CreateProcess("G:\\Projects\\操作系統(tǒng)編程實驗\\創(chuàng)建進程\\Child\\Debug\\Child.exe",NULL,…)(該參數(shù)可認(rèn)為NULL,這時文件名必須是參數(shù)lpCommandLine指向字符串中第一個空格界定標(biāo)記。)實驗創(chuàng)建進程第12頁LPTSTRlpCommandLinelpCommandLine參數(shù)用來指定傳遞給新進程命令行字符串。在此次試驗中,不需要這個參數(shù),能夠設(shè)為NULL。(在很多時候,我們將可執(zhí)行文件名和命令行參數(shù)都傳給lpCommandLine參數(shù),CreateProcess函數(shù)分析lpCommandLine參數(shù)時,會把該字符串中第一個空格分隔標(biāo)識作為可執(zhí)行文件名,假如是可執(zhí)行文件名是部分路徑,則函數(shù)會在系統(tǒng)目錄中按從下到上次序搜索可執(zhí)行文件。)實驗創(chuàng)建進程第13頁LPSECURITY_ATTRIBUTESlpProcessAttributes和LPSECURITY_ATTRIBUTESlpThreadAttributes

lpProcessAttributes和lpThreadAttributes

都是指向指向LPSECURITY_ATTRIBUTES結(jié)構(gòu)體指針。前面介紹過,當(dāng)調(diào)用CreateProcess函數(shù)創(chuàng)建新進程時,系統(tǒng)將為新進程創(chuàng)建一個進程內(nèi)查對象和一個根本程內(nèi)查對象。lpProcessAttributes和lpThreadAttributes

參數(shù)就是分別用來設(shè)置新進程內(nèi)查對象和根本程內(nèi)查對象安全屬性。在此次試驗中為這兩參數(shù)傳遞NULL,讓系統(tǒng)為這兩個對象賦予默認(rèn)安全描述符。CreateProcess(“….exe”,NULL,NULL,NULL…)實驗創(chuàng)建進程第14頁BOOLbInheritHandlesbInheritHandles用來指定父進程隨即創(chuàng)建子進程是否能夠繼承父進程對象句柄。假如該參數(shù)為TRUE,那么父進程每個可繼承打開句柄都能被子進程繼承。在此次試驗中,把這個參數(shù)設(shè)置為FALSE,因為子進程不需要繼承父進程可繼承句柄。CreateProcess(“….exe”,NULL,NULL,NULL,FALSE,…)實驗創(chuàng)建進程第15頁DWORDdwCreationFlagsdwCreationFlags指定進程創(chuàng)建附加標(biāo)識,也能夠用于控制新進程優(yōu)先級。假如只為了開啟子進程,不需要設(shè)置創(chuàng)建標(biāo)識,則直接設(shè)置為0.假如不需要為應(yīng)用程序創(chuàng)建控制臺窗口,則能夠設(shè)置該參數(shù)為CREATE_NO_WINDOW.假如需要創(chuàng)建新控制臺窗口,而不是繼承父進程控制臺窗口,則設(shè)置為CREATE_NEW_CONSOLE.此次試驗中設(shè)置為該標(biāo)識。CreateProcess(“….exe”,…,

CREATE_NEW_CONSOLE,

…)該參數(shù)能夠取得創(chuàng)建標(biāo)識很多,也能夠用于設(shè)置新進程優(yōu)先級。更多設(shè)置能夠參看MSDN。實驗創(chuàng)建進程第16頁LPVOIDlpEnvironmentlpEnvironment是一個指向環(huán)境塊指針,假如此參數(shù)是NULL,那么新進程使用調(diào)用進程環(huán)境。通常都為此參數(shù)傳遞NULL。LPTSTRlpCurrentDirectorylpCurrentDirectory參數(shù)是一個指向空終止字符串,用來指定子進程當(dāng)前路徑,這個字符串必須是一個完整路徑名,包含驅(qū)動器標(biāo)識符,假如此參數(shù)為NULL,那么新子進程將于調(diào)用進程(父進程)用有相同驅(qū)動器和目錄。CreateProcess(“….exe”,…,

CREATE_NO_WINDOW,NULL,NULL,…)實驗創(chuàng)建進程第17頁LPSTARTUPINFOlpStartupInfolpStartupInfo是一個指向STARTUPINFO結(jié)構(gòu)體指針,用來指定新進程主窗口將怎樣顯示。typedefstruct_STARTUPINFO{DWORDcb;LPTSTRlpReserved;LPTSTRlpDesktop;LPTSTRlpTitle;……

……HANDLEhStdInput;HANDLEhStdOutput;HANDLEhStdError;}STARTUPINFO,*LPSTARTUPINFO;實驗創(chuàng)建進程第18頁STARTUPINFO結(jié)構(gòu)體組員比較多,并不需要為其全部組員都賦值。其中cb表示該結(jié)構(gòu)體本身大小,以字節(jié)為單位,通常都要為其cb組員賦值,不然函數(shù)調(diào)用會失敗。在創(chuàng)建進程之前準(zhǔn)備工作就包含給該結(jié)構(gòu)體變量賦值。在此次試驗中,不需要設(shè)置其它開啟信息,所以直接給cb參數(shù)賦值就能夠。STARTUPINFOsui;ZeroMemory(&sui,sizeof(sui));sui.cb=sizeof(STARTUPINFO);CreateProcess(…,&si,…);實驗創(chuàng)建進程第19頁LPPROCESS_INFORMATIONlpProcessInformationlpProcessInformation參數(shù)作為返回值使用,是一個指向PROCESS_INFORMATION結(jié)構(gòu)體指針,用來接收關(guān)于新進程標(biāo)志信息。PROCESS_INFORMATION結(jié)構(gòu)體定義以下所表示:typedefstruct_PROCESS_INFORMATION{HANDLEhProcess;HANDLEhThread;DWORDdwProcessId;DWORDdwThreadId;}PROCESS_INFORMATION;實驗創(chuàng)建進程第20頁hProcess和hThread分別是標(biāo)識新創(chuàng)建進程句柄和新創(chuàng)建進程根本程句柄;dwProcessId和dwThreadId分別是全局進程標(biāo)識符和全局線程標(biāo)識符,前者用來標(biāo)識一個進程,后者用來標(biāo)識一個線程。(當(dāng)開啟一個進程時,系統(tǒng)會為此進程分配一個標(biāo)識符,同時這個進程中線程也會被分配一個標(biāo)識符,在一個進程運行時,該進程標(biāo)識符和線程標(biāo)識符是唯一,停頓后,這些標(biāo)識符可能會被系統(tǒng)分配給其它進程和線程。)實驗創(chuàng)建進程第21頁在創(chuàng)建進程之前另一項準(zhǔn)備工作就是要定義PROCESS_INFORMATION結(jié)構(gòu)體變量,準(zhǔn)備用于接收創(chuàng)建進程后返回信息。PROCESS_INFORMATIONpi;CreateProcess(…,&si,&pi);實驗創(chuàng)建進程第22頁CreateProcess函數(shù)返回值創(chuàng)建進程成功后,該函數(shù)返回TRUE,不然返回FALSE.在程序中需要判斷進程創(chuàng)建是否成功If(!CreateProcess(…,&si,&pi))//創(chuàng)建不成功Return;Else //創(chuàng)建成功 //父進程繼續(xù)執(zhí)行實驗創(chuàng)建進程第23頁在父進程創(chuàng)建子進程后,子進程就開始運行;同時父進程計算1——100和。因為計算太快,為了方便觀察父進程和子進程系統(tǒng)工作過程,能夠在計算過程使用Sleep函數(shù),強制讓父進程根本程休眠。Sleep函數(shù)定義以下:void

Sleep(

DWORD

dwMilliseconds);//休眠一段時間,以ms為單位Sleep(1000);//表示休眠1秒實驗創(chuàng)建進程第24頁計算完之后等候子進程完成它工作。等候子進程完成能夠用WaitForSingleObject函數(shù)實現(xiàn)等候。該函數(shù)定義以下:DWORD

WaitForSingleObject(HANDLE

hHandle,DWORD

dwMilliseconds);實驗創(chuàng)建進程第25頁hHandle參數(shù)指定需要等候?qū)ο缶浔?。dwMilliseconds參數(shù)指定需要等候時間,以ms為單位。0表示馬上返回不等候。INFINITE表示等候直到對象句柄可用。WaitForSingleObject(pi.hProcess,INFINITE);實驗創(chuàng)建進程第26頁父進程等候子進程完成工作后,父進程需要讀取文件內(nèi)容并輸出,是文件一個操作。這在下面在子進程中介紹文件操作時一起系統(tǒng)介紹。實驗創(chuàng)建進程第27頁子進程工作主要包括是文件操作。創(chuàng)建文件能夠用fopen函數(shù)FILE*fopen( //返回一個指向文件結(jié)構(gòu)體指針constchar*filename,//打開或創(chuàng)建文件名const

char*mode

//打開或創(chuàng)建方式,即設(shè)定讀寫權(quán)限);Fopen函數(shù)既能夠創(chuàng)建文件也能夠打開已存在文件FILE*pFile=fopen("1.txt","w"); 子進程實驗創(chuàng)建

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論