2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩33頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、操作系統(tǒng)實(shí)驗(yàn) 創(chuàng)建進(jìn)程,,學(xué)會(huì)通過(guò)基本的Windows進(jìn)程控制函數(shù),由父進(jìn)程創(chuàng)建子進(jìn)程。,實(shí)驗(yàn)?zāi)康?我們?cè)O(shè)計(jì)一個(gè)應(yīng)用程序時(shí),有時(shí)候需要另外一段代碼做一些其它工作。方法如下:一、函數(shù)調(diào)用或者子程序弊端:我們可以用函數(shù)調(diào)用或者子程序,但是我們調(diào)用函數(shù)之后,只能等函數(shù)返回;二、在進(jìn)程內(nèi)創(chuàng)建一個(gè)新線(xiàn)程弊端:但是如果在一個(gè)復(fù)雜應(yīng)用系統(tǒng)中,我們有可能不慎改寫(xiě)了進(jìn)程地址空間中的某些數(shù)據(jù)(例如某些引用數(shù)據(jù)),導(dǎo)致其它工作不能正確地進(jìn)行。,,三

2、、創(chuàng)建新進(jìn)程(子進(jìn)程)所以當(dāng)我們需要某些工作同時(shí)進(jìn)行,并且希望保護(hù)它們的運(yùn)行地址空間時(shí),一個(gè)很好地辦法是創(chuàng)建一個(gè)新進(jìn)程來(lái)執(zhí)行需要同時(shí)進(jìn)行的工作。,,假設(shè)現(xiàn)在有這樣的一個(gè)工作,需要計(jì)算1——100的和,還需要做一個(gè)工作是讀寫(xiě)文件。我們可以讓父進(jìn)程計(jì)算,創(chuàng)建一個(gè)子進(jìn)程實(shí)現(xiàn)讀寫(xiě)文件。主要工作:1、首先由父進(jìn)程創(chuàng)建子進(jìn)程2、讓子進(jìn)程創(chuàng)建一個(gè)文件并寫(xiě)入數(shù)據(jù),子進(jìn)程寫(xiě)文件過(guò)程中,父進(jìn)程繼續(xù)執(zhí)行計(jì)算工作3、等子進(jìn)程執(zhí)行完以后,父進(jìn)程讀

3、取文件內(nèi)容輸出,實(shí)現(xiàn)進(jìn)程協(xié)同工作。,實(shí)驗(yàn)內(nèi)容,父進(jìn)程框架void main(){//為創(chuàng)建進(jìn)程做準(zhǔn)備工作//創(chuàng)建子進(jìn)程If(創(chuàng)建失?。┓祷谽lse(創(chuàng)建成功)//執(zhí)行計(jì)算1——100的和//等子進(jìn)程執(zhí)行完,讀取子進(jìn)程的文件內(nèi)容,并輸出。},程序框架,子進(jìn)程框架void main(){//創(chuàng)建文件If(失?。┓祷谽lse(成功)//向文件寫(xiě)入數(shù)據(jù)//讀取文件內(nèi)容輸出},,BOOL CreateProc

4、ess( LPCTSTR lpApplicationName , //指定可執(zhí)行程序名LPTSTR lpCommandLine , //命令行字符串,可以為NULLLPSECURITY_ATTRIBUTES lpProcessAttributes , //新進(jìn)程對(duì)象的安全屬性L(fǎng)PSECURITY_ATTRIBUTES lpThreadAttributes , //新進(jìn)程對(duì)應(yīng)線(xiàn)程的安全屬性BOOL bInheritHandles

5、 ,//指定父進(jìn)程的對(duì)象句柄是否能被子進(jìn)程繼承DWORD dwCreationFlags , //指定創(chuàng)建進(jìn)程的附加標(biāo)記,即指定新創(chuàng)建進(jìn)程的特性L(fǎng)PVOID lpEnvironment ,//指定新進(jìn)程使用的環(huán)境,NULL表示同父進(jìn)程環(huán)境LPCTSTR lpCurrentDirectory , //指定子進(jìn)程當(dāng)前路徑,NULL表示與父進(jìn)程路徑相同LPSTARTUPINFO lpStartupInfo , //指定新進(jìn)程主窗口如何

6、顯示LPPROCESS_INFORMATION lpProcessInformation //作為返回值使用,是一個(gè)指針);,父進(jìn)程創(chuàng)建子進(jìn)程用CreateProcess函數(shù)來(lái)創(chuàng)建一個(gè)新進(jìn)程,當(dāng)調(diào)用CreateProcess時(shí),系統(tǒng)所做的工作:1、首先,系統(tǒng)創(chuàng)建一個(gè)進(jìn)程內(nèi)核對(duì)象,其初始使用計(jì)數(shù)為1。(進(jìn)程內(nèi)核對(duì)象并不代表進(jìn)程本身,而是操作系統(tǒng)用來(lái)管理這個(gè)進(jìn)程的一個(gè)數(shù)據(jù)結(jié)構(gòu)。),,2、然后,系統(tǒng)為新進(jìn)程創(chuàng)建一個(gè)虛擬地址空間

7、,并將可執(zhí)行文件(和所有必要的DLL)的代碼及數(shù)據(jù)加載到進(jìn)程的地址空間。3、最后,系統(tǒng)為新進(jìn)程創(chuàng)建一個(gè)主線(xiàn)程內(nèi)核對(duì)象(使用計(jì)數(shù)為1)(線(xiàn)程內(nèi)核對(duì)象是操作系統(tǒng)用來(lái)管理線(xiàn)程的數(shù)據(jù)結(jié)構(gòu)。),,系統(tǒng)做完這些工作以后,新進(jìn)程的主線(xiàn)程就開(kāi)始執(zhí)行運(yùn)行時(shí)的啟動(dòng)代碼,在啟動(dòng)代碼中會(huì)調(diào)用應(yīng)用程序的main函數(shù),這樣,新進(jìn)程就從main函數(shù)開(kāi)始執(zhí)行。如果調(diào)用CreateProcess函數(shù)后,系統(tǒng)成功創(chuàng)建了新進(jìn)程并且創(chuàng)建了其主線(xiàn)程,則系統(tǒng)返回TRU

8、E,否則返回FALSE。,,討論CreateProcess的參數(shù)。LPCTSTR lpApplicationNamelpApplicationName參數(shù)指定新進(jìn)程要使用的可執(zhí)行文件的名稱(chēng)。可以是完整路徑和文件名,也可以是部分名稱(chēng)。注意一定要加上擴(kuò)展名“.exe”。在本次實(shí)驗(yàn)中,使用全路徑和文件名。CreateProcess("G:\\Projects\\操作系統(tǒng)編程實(shí)驗(yàn)\\創(chuàng)建進(jìn)程\\Child\\Debug\\C

9、hild.exe",NULL,…)(該參數(shù)可以為NULL,這時(shí)文件名必須是參數(shù)lpCommandLine 指向的字符串中第一個(gè)空格界定的標(biāo)記。),,LPTSTR lpCommandLinelpCommandLine參數(shù)用來(lái)指定傳遞給新進(jìn)程的命令行字符串。在本次實(shí)驗(yàn)中,不需要這個(gè)參數(shù),可以設(shè)為NULL。(在很多時(shí)候,我們將可執(zhí)行文件名和命令行參數(shù)都傳給lpCommandLine參數(shù),CreateProcess函數(shù)分析

10、lpCommandLine參數(shù)時(shí),會(huì)把該字符串中第一個(gè)空格分隔的標(biāo)記作為可執(zhí)行文件名,如果是可執(zhí)行文件名是部分路徑,則函數(shù)會(huì)在系統(tǒng)目錄中按從下到上的順序搜索可執(zhí)行文件。),,LPSECURITY_ATTRIBUTES lpProcessAttributes 和 LPSECURITY_ATTRIBUTES lpThreadAttributes lpProcessAttributes和lpThreadAttributes 都是指向指向

11、LPSECURITY_ATTRIBUTES 結(jié)構(gòu)體的指針。前面介紹過(guò),當(dāng)調(diào)用CreateProcess函數(shù)創(chuàng)建新進(jìn)程時(shí),系統(tǒng)將為新進(jìn)程創(chuàng)建一個(gè)進(jìn)程內(nèi)核對(duì)象和一個(gè)主線(xiàn)程內(nèi)核對(duì)象。lpProcessAttributes和lpThreadAttributes 參數(shù)就是分別用來(lái)設(shè)置新進(jìn)程內(nèi)核對(duì)象和主線(xiàn)程內(nèi)核對(duì)象的安全屬性。在本次實(shí)驗(yàn)中為這兩參數(shù)傳遞NULL,讓系統(tǒng)為這兩個(gè)對(duì)象賦予默認(rèn)的安全描述符。CreateProcess(“….

12、exe”,NULL,NULL,NULL…),BOOL bInheritHandlesbInheritHandles用來(lái)指定父進(jìn)程隨后創(chuàng)建的子進(jìn)程是否能夠繼承父進(jìn)程的對(duì)象句柄。如果該參數(shù)為T(mén)RUE,那么父進(jìn)程的每個(gè)可繼承打開(kāi)句柄都能被子進(jìn)程繼承。在本次實(shí)驗(yàn)中,把這個(gè)參數(shù)設(shè)置為FALSE,因?yàn)樽舆M(jìn)程不需要繼承父進(jìn)程的可繼承句柄。CreateProcess(“….exe”,NULL,NULL,NULL,FALSE,…),DWORD

13、 dwCreationFlagsdwCreationFlags指定進(jìn)程創(chuàng)建的附加標(biāo)記,也可以用于控制新進(jìn)程的優(yōu)先級(jí)。如果只為了啟動(dòng)子進(jìn)程,不需要設(shè)置創(chuàng)建標(biāo)記,則直接設(shè)置為0.如果不需要為應(yīng)用程序創(chuàng)建控制臺(tái)窗口,則可以設(shè)置該參數(shù)為CREATE_NO_WINDOW.如果需要?jiǎng)?chuàng)建新控制臺(tái)窗口,而不是繼承父進(jìn)程的控制臺(tái)窗口,則設(shè)置為CREATE_NEW_CONSOLE.本次實(shí)驗(yàn)中設(shè)置為該標(biāo)記。CreateProcess(“….ex

14、e”,…, CREATE_NEW_CONSOLE, …)該參數(shù)可以取得創(chuàng)建標(biāo)記很多,也可以用于設(shè)置新進(jìn)程的優(yōu)先級(jí)。更多的設(shè)置可以參看MSDN。,LPVOID lpEnvironmentlpEnvironment是一個(gè)指向環(huán)境塊的指針,如果此參數(shù)是NULL,那么新進(jìn)程使用調(diào)用進(jìn)程的環(huán)境。通常都為此參數(shù)傳遞NULL。LPTSTR lpCurrentDirectorylpCurrentDirectory參數(shù)是一個(gè)指向空終止的字符串

15、,用來(lái)指定子進(jìn)程當(dāng)前的路徑,這個(gè)字符串必須是一個(gè)完整的路徑名,包括驅(qū)動(dòng)器的標(biāo)識(shí)符,如果此參數(shù)為NULL,那么新的子進(jìn)程將于調(diào)用進(jìn)程(父進(jìn)程)用有相同的驅(qū)動(dòng)器和目錄。CreateProcess(“….exe”,…, CREATE_NO_WINDOW,NULL,NULL,…),LPSTARTUPINFO lpStartupInfolpStartupInfo是一個(gè)指向STARTUPINFO結(jié)構(gòu)體的指針,用來(lái)指定新進(jìn)程的主窗口將如何顯示。

16、typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; …… ……HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO;,STARTUPINFO結(jié)構(gòu)體成員比較多,并不需要為

17、其所有成員都賦值。其中cb表示該結(jié)構(gòu)體本身的大小,以字節(jié)為單位,通常都要為其cb成員賦值,否則函數(shù)調(diào)用會(huì)失敗。在創(chuàng)建進(jìn)程之前的準(zhǔn)備工作就包括給該結(jié)構(gòu)體變量賦值。在本次實(shí)驗(yàn)中,不需要設(shè)置其它啟動(dòng)信息,所以直接給cb參數(shù)賦值就可以。STARTUPINFO sui;ZeroMemory(&sui,sizeof(sui));sui.cb=sizeof(STARTUPINFO);CreateProcess(…,&s

18、i,…);,,LPPROCESS_INFORMATION lpProcessInformationlpProcessInformation參數(shù)作為返回值使用,是一個(gè)指向PROCESS_INFORMATION結(jié)構(gòu)體的指針,用來(lái)接收關(guān)于新進(jìn)程的標(biāo)志信息。PROCESS_INFORMATION結(jié)構(gòu)體定義如下所示:typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HAN

19、DLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION;,,hProcess和hThread分別是標(biāo)識(shí)新創(chuàng)建的進(jìn)程句柄和新創(chuàng)建進(jìn)程的主線(xiàn)程句柄;dwProcessId和dwThreadId分別是全局進(jìn)程標(biāo)識(shí)符和全局線(xiàn)程標(biāo)識(shí)符,前者用來(lái)標(biāo)識(shí)一個(gè)進(jìn)程,后者用來(lái)標(biāo)識(shí)一個(gè)線(xiàn)程。(當(dāng)啟動(dòng)一個(gè)進(jìn)程時(shí),系統(tǒng)會(huì)為此進(jìn)程分配一個(gè)標(biāo)識(shí)符,同時(shí)這個(gè)進(jìn)程中的線(xiàn)程

20、也會(huì)被分配一個(gè)標(biāo)識(shí)符,在一個(gè)進(jìn)程運(yùn)行時(shí),該進(jìn)程的標(biāo)識(shí)符和線(xiàn)程的標(biāo)識(shí)符是唯一的,停止后,這些標(biāo)識(shí)符可能會(huì)被系統(tǒng)分配給其它進(jìn)程和線(xiàn)程。),,在創(chuàng)建進(jìn)程之前的另一項(xiàng)準(zhǔn)備工作就是要定義PROCESS_INFORMATION 結(jié)構(gòu)體變量,準(zhǔn)備用于接收創(chuàng)建進(jìn)程后返回的信息。PROCESS_INFORMATION pi;CreateProcess(…,&si,&pi);,,CreateProcess函數(shù)的返回值創(chuàng)建進(jìn)程成功后,

21、該函數(shù)返回TRUE,否則返回FALSE.在程序中需要判斷進(jìn)程創(chuàng)建是否成功If(!CreateProcess(…,&si,&pi))//創(chuàng)建不成功Return;Else//創(chuàng)建成功//父進(jìn)程繼續(xù)執(zhí)行,,在父進(jìn)程創(chuàng)建子進(jìn)程后,子進(jìn)程就開(kāi)始運(yùn)行;同時(shí)父進(jìn)程計(jì)算1——100的和。因?yàn)橛?jì)算太快,為了方便觀(guān)察父進(jìn)程和子進(jìn)程系統(tǒng)工作的過(guò)程,可以在計(jì)算過(guò)程使用Sleep 函數(shù),強(qiáng)制讓父進(jìn)程的主線(xiàn)程休眠。Sleep

22、函數(shù)定義如下:void Sleep( DWORD dwMilliseconds);//休眠一段時(shí)間,以ms為單位Sleep(1000);//表示休眠1秒,計(jì)算完之后等待子進(jìn)程完成它的工作。等待子進(jìn)程完成可以用WaitForSingleObject函數(shù)實(shí)現(xiàn)等待。該函數(shù)定義如下:DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds );,,hHandl

23、e參數(shù)指定需要等待的對(duì)象句柄。dwMilliseconds 參數(shù)指定需要等待的時(shí)間,以ms為單位。0表示立即返回不等待。INFINITE表示等待直到對(duì)象句柄可用。WaitForSingleObject( pi.hProcess,INFINITE);,,父進(jìn)程等待子進(jìn)程完成工作后,父進(jìn)程需要讀取文件內(nèi)容并輸出,是文件的一種操作。這在下面在子進(jìn)程中介紹文件操作時(shí)一起系統(tǒng)介紹。,,子進(jìn)程的工作主要涉及的是文件操作。創(chuàng)建文件可以用f

24、open函數(shù)FILE *fopen( //返回一個(gè)指向文件結(jié)構(gòu)體的指針const char *filename, //打開(kāi)或創(chuàng)建的文件名const char *mode //打開(kāi)或創(chuàng)建方式,即設(shè)定讀寫(xiě)權(quán)限); Fopen函數(shù)既可以創(chuàng)建文件也可以打開(kāi)已存在的文件FILE *pFile=fopen("1.txt","w");,子進(jìn)程,文件寫(xiě)操作可以用fwrite函數(shù)size_t f

25、write( const void *buffer, //指向要寫(xiě)入內(nèi)容的文件指針size_t size, //每次寫(xiě)入大小,字節(jié)為單位size_t count, //寫(xiě)入次數(shù)FILE *stream //一個(gè)指向文件結(jié)構(gòu)體的指針,表示將要寫(xiě)操作的文件);fwrite("Xidian University",1,strlen("Xidian University"),pFile);,

26、,讀文件操作用fread函數(shù)size_t fread( const void *buffer, //指向要讀取內(nèi)容的文件指針size_t size, //每次讀取大小,字節(jié)為單位size_t count, //讀取次數(shù)FILE *stream //一個(gè)指向文件結(jié)構(gòu)體的指針,表示將要寫(xiě)讀取操作的文件);,,在每次寫(xiě)入文件盒讀取文件操作后,關(guān)閉文件,使用fclose函數(shù)int fclose( FILE *stream );/

溫馨提示

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

評(píng)論

0/150

提交評(píng)論