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

下載本文檔

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

文檔簡介

操作系統(tǒng)試驗

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

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

lpProcessAttributes和lpThreadAttributes

都是指向指向LPSECURITY_ATTRIBUTES結構體指針。前面介紹過,當調用CreateProcess函數創(chuàng)建新進程時,系統(tǒng)將為新進程創(chuàng)建一個進程內查對象和一個根本程內查對象。lpProcessAttributes和lpThreadAttributes

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

CREATE_NEW_CONSOLE,

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

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

……HANDLEhStdInput;HANDLEhStdOutput;HANDLEhStdError;}STARTUPINFO,*LPSTARTUPINFO;實驗創(chuàng)建進程第18頁STARTUPINFO結構體組員比較多,并不需要為其全部組員都賦值。其中cb表示該結構體本身大小,以字節(jié)為單位,通常都要為其cb組員賦值,不然函數調用會失敗。在創(chuàng)建進程之前準備工作就包含給該結構體變量賦值。在此次試驗中,不需要設置其它開啟信息,所以直接給cb參數賦值就能夠。STARTUPINFOsui;ZeroMemory(&sui,sizeof(sui));sui.cb=sizeof(STARTUPINFO);CreateProcess(…,&si,…);實驗創(chuàng)建進程第19頁LPPROCESS_INFORMATIONlpProcessInformationlpProcessInformation參數作為返回值使用,是一個指向PROCESS_INFORMATION結構體指針,用來接收關于新進程標志信息。PROCESS_INFORMATION結構體定義以下所表示:typedefstruct_PROCESS_INFORMATION{HANDLEhProcess;HANDLEhThread;DWORDdwProcessId;DWORDdwThreadId;}PROCESS_INFORMATION;實驗創(chuàng)建進程第20頁hProcess和hThread分別是標識新創(chuàng)建進程句柄和新創(chuàng)建進程根本程句柄;dwProcessId和dwThreadId分別是全局進程標識符和全局線程標識符,前者用來標識一個進程,后者用來標識一個線程。(當開啟一個進程時,系統(tǒng)會為此進程分配一個標識符,同時這個進程中線程也會被分配一個標識符,在一個進程運行時,該進程標識符和線程標識符是唯一,停頓后,這些標識符可能會被系統(tǒng)分配給其它進程和線程。)實驗創(chuàng)建進程第21頁在創(chuàng)建進程之前另一項準備工作就是要定義PROCESS_INFORMATION結構體變量,準備用于接收創(chuàng)建進程后返回信息。PROCESS_INFORMATIONpi;CreateProcess(…,&si,&pi);實驗創(chuàng)建進程第22頁CreateProcess函數返回值創(chuàng)建進程成功后,該函數返回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函數,強制讓父進程根本程休眠。Sleep函數定義以下:void

Sleep(

DWORD

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

WaitForSingleObject(HANDLE

hHandle,DWORD

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

char*mode

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

溫馨提示

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

評論

0/150

提交評論