第4章 進(jìn)程間通信new_第1頁
第4章 進(jìn)程間通信new_第2頁
第4章 進(jìn)程間通信new_第3頁
第4章 進(jìn)程間通信new_第4頁
第4章 進(jìn)程間通信new_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第四章第四章 進(jìn)程間通信進(jìn)程間通信 內(nèi)內(nèi) 容容 提提 要要 1、進(jìn)程與進(jìn)程間通信 2、創(chuàng)建一個(gè)進(jìn)程 3、終止進(jìn)程的運(yùn)行 4、進(jìn)程通信 5、內(nèi)存文件映射 4.1 4.1 進(jìn)程與進(jìn)程間通信進(jìn)程與進(jìn)程間通信 第四章第四章 進(jìn)程間通信進(jìn)程間通信 進(jìn)程的定義: 進(jìn)程是應(yīng)用程序的執(zhí)行實(shí)例,每個(gè)進(jìn)程都有私有 的虛擬地址空間、代碼、數(shù)據(jù)和其它系統(tǒng)資源。 操作系統(tǒng)在創(chuàng)建進(jìn)程時(shí)為其分配資源,在進(jìn)程結(jié) 束時(shí)回收資源。在很多實(shí)際應(yīng)用中,往往需要多個(gè)進(jìn) 程協(xié)同工作,它們之間經(jīng)常需要交換一定的數(shù)據(jù)以便 協(xié)同進(jìn)行工作,這就要用到進(jìn)程間通信機(jī)制。 進(jìn)程是程序在計(jì)算機(jī)上的一次執(zhí)行活動(dòng)。 當(dāng)你運(yùn)行一個(gè)程序,你就啟動(dòng)了一個(gè)進(jìn)程。顯

2、 然,程序是死的(靜態(tài)的),進(jìn)程是活的(動(dòng)態(tài) 的)。 每個(gè)進(jìn)程都有私有的虛擬地址空間、代碼、 數(shù)據(jù)以及其它可利用的系統(tǒng)資源。 虛擬地址空間(一) v由于在由于在32位系統(tǒng)下,地址總線是位系統(tǒng)下,地址總線是32位的,即位的,即4個(gè)字個(gè)字 節(jié)大小,取值范圍為節(jié)大小,取值范圍為0 x00000000到到0 xffffffff ;由于地址總線最大只能尋址到;由于地址總線最大只能尋址到0 xffffffff,所,所 以它的尋址能力就是以它的尋址能力就是4gb。 v雖然每一個(gè)雖然每一個(gè)32位進(jìn)程可使用位進(jìn)程可使用4gb的地址空間,但并的地址空間,但并 不意味著每一個(gè)進(jìn)程實(shí)際擁有不意味著每一個(gè)進(jìn)程實(shí)際擁有4

3、gb的物理地址空間的物理地址空間 ,該地址空間僅僅是一個(gè)虛擬地址空間,此虛擬地,該地址空間僅僅是一個(gè)虛擬地址空間,此虛擬地 址空間只是內(nèi)存地址的一個(gè)范圍。址空間只是內(nèi)存地址的一個(gè)范圍。32位系統(tǒng)的虛擬位系統(tǒng)的虛擬 地址空間范圍從地址空間范圍從0 x000000000 xffffffff( 4gb) 虛擬地址空間(二) v進(jìn)程實(shí)際可以得到的物理內(nèi)存要遠(yuǎn)小于其虛擬地址進(jìn)程實(shí)際可以得到的物理內(nèi)存要遠(yuǎn)小于其虛擬地址 空間。空間。 v例如:程序例如:程序a有有4gb虛擬地址空間,但是它實(shí)際在虛擬地址空間,但是它實(shí)際在 物理內(nèi)存的物理內(nèi)存的0 x100000000 x10010000; v程序程序b也有也

4、有4gb虛擬地址空間,但是它實(shí)際在物理虛擬地址空間,但是它實(shí)際在物理 內(nèi)存的內(nèi)存的0 x200000000 x20010000; v一個(gè)程序不可能申請(qǐng)實(shí)時(shí)的有一個(gè)程序不可能申請(qǐng)實(shí)時(shí)的有4gb的內(nèi)存映射到物的內(nèi)存映射到物 理內(nèi)存上,只是映射經(jīng)常用到的那部分?jǐn)?shù)據(jù)而已,理內(nèi)存上,只是映射經(jīng)常用到的那部分?jǐn)?shù)據(jù)而已, 不經(jīng)常用到都被轉(zhuǎn)換到虛擬內(nèi)存上了。不經(jīng)常用到都被轉(zhuǎn)換到虛擬內(nèi)存上了。 虛擬內(nèi)存 v虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理內(nèi)存管理的一種技術(shù)。的一種技術(shù)。 它使得它使得應(yīng)用程序應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的認(rèn)為它擁有連續(xù)的可用的內(nèi)存內(nèi)存 (一個(gè)連續(xù)完整的(一個(gè)連續(xù)完整的地址空間地址

5、空間),而實(shí)際上,它),而實(shí)際上,它 通常是被分隔成多個(gè)通常是被分隔成多個(gè)物理內(nèi)存物理內(nèi)存碎片,還有部分碎片,還有部分 暫時(shí)存儲(chǔ)在外部暫時(shí)存儲(chǔ)在外部磁盤存儲(chǔ)器磁盤存儲(chǔ)器上,在需要時(shí)進(jìn)行上,在需要時(shí)進(jìn)行 數(shù)據(jù)交換數(shù)據(jù)交換。 虛擬地址空間 v4g的虛擬地址空間大致分為的虛擬地址空間大致分為4塊,從低地址到高地址塊,從低地址到高地址 依次是:依次是:null區(qū),用戶區(qū),隔離區(qū),核心區(qū)區(qū),用戶區(qū),隔離區(qū),核心區(qū)。用戶。用戶 私有的數(shù)據(jù)都在用戶區(qū);系統(tǒng)內(nèi)核等都在核心區(qū)。私有的數(shù)據(jù)都在用戶區(qū);系統(tǒng)內(nèi)核等都在核心區(qū)。 v總體來說,總體來說,a進(jìn)程的虛擬地址空間中的內(nèi)容和進(jìn)程的虛擬地址空間中的內(nèi)容和b進(jìn)程進(jìn)程

6、 相比,只有各自的用戶區(qū)不一致。通常用戶區(qū)中,進(jìn)相比,只有各自的用戶區(qū)不一致。通常用戶區(qū)中,進(jìn) 程又會(huì)將程又會(huì)將exe文件中定義的代碼段、堆棧段、數(shù)據(jù)段文件中定義的代碼段、堆棧段、數(shù)據(jù)段 等各個(gè)段映射到用戶區(qū)的特定不同部位。等各個(gè)段映射到用戶區(qū)的特定不同部位。 v這這4gb地址空間的一些部分被映射了物理內(nèi)存,一些地址空間的一些部分被映射了物理內(nèi)存,一些 部分映射硬盤上的交換文件,一些部分什么也沒有映部分映射硬盤上的交換文件,一些部分什么也沒有映 射。射。 v進(jìn)程的虛擬地址空間是為每個(gè)進(jìn)程所私有的進(jìn)程的虛擬地址空間是為每個(gè)進(jìn)程所私有的 ,在進(jìn)程內(nèi)運(yùn)行的線程對(duì)內(nèi)存空間的訪問都,在進(jìn)程內(nèi)運(yùn)行的線程對(duì)

7、內(nèi)存空間的訪問都 被限制在調(diào)用進(jìn)程之內(nèi),而不能訪問屬于其被限制在調(diào)用進(jìn)程之內(nèi),而不能訪問屬于其 他進(jìn)程的內(nèi)存空間。他進(jìn)程的內(nèi)存空間。 虛擬地址空間 v由于在32位系統(tǒng)下我們的地址總線是32位的,即4個(gè)字節(jié)大小,所以, 它的取值范圍為0 x00000000到0 xffffffff;由于地址總線最大只能尋 址到0 xffffffff,所以它的尋址能力就是4gb;這就是我們說的4gb 地址空間了;舉個(gè)實(shí)際的例子,你買臺(tái)電腦,如果你安裝的是32位系統(tǒng) ,那么你即使插上8gb內(nèi)存,也只能識(shí)別4gb(實(shí)際比4gb還要小,因 為你的顯卡上的顯存還要吃掉一部分,如果顯存512mb,實(shí)際只能識(shí)別 3.5gb內(nèi)存

8、) 其次,程序的4gb空間是虛擬地址空間,每個(gè)程序都有 4gb的虛擬地址空間;但是他們實(shí)際占用的物理內(nèi)存是程序運(yùn)行時(shí)映射 到物理內(nèi)存上的;也就是說程序a有4gb虛擬地址空間,但是它實(shí)際在 物理內(nèi)存的0 x100000000 x10010000;程序b也有4gb虛擬地址空間, 但是它實(shí)際在物理內(nèi)存的0 x200000000 x20010000;你的程序不可能 申請(qǐng)實(shí)時(shí)的有4gb的內(nèi)存映射到物理內(nèi)存上,只是映射你經(jīng)常用到的那 部分?jǐn)?shù)據(jù)而已,不經(jīng)常用到都被轉(zhuǎn)換到虛擬內(nèi)存上了(虛擬內(nèi)存技術(shù), 就是寫到你的硬盤上了); 進(jìn)程可以分為系統(tǒng)進(jìn)程和用戶進(jìn)程。 凡是用于完成操作系統(tǒng)的各種功能的進(jìn) 程就是系統(tǒng)進(jìn)程

9、,它們就是處于運(yùn)行狀態(tài)下 的操作系統(tǒng)本身; 用戶進(jìn)程就是所有由你啟動(dòng)的進(jìn)程。 進(jìn)程是操作系統(tǒng)進(jìn)行資源分配的單位。 進(jìn)程與線程 v在一個(gè)進(jìn)程內(nèi)又可包含多條可并發(fā)執(zhí)行的路 徑,每條執(zhí)行路徑叫做一個(gè)線程,一個(gè)進(jìn)程 至少包含一個(gè)主線程。主線程負(fù)責(zé)執(zhí)行運(yùn)行 的啟動(dòng)代碼。 v另外,一個(gè)進(jìn)程可以創(chuàng)建若干子進(jìn)程。 v當(dāng)進(jìn)程被創(chuàng)建時(shí),系統(tǒng)自動(dòng)產(chǎn)生主線程,主 線程然后可創(chuàng)建更多的線程。 并發(fā) v在操作系統(tǒng)中,是指一個(gè)時(shí)間段中有幾個(gè)程 序都處于已啟動(dòng)運(yùn)行到運(yùn)行完畢之間,且這 幾個(gè)程序都是在同一個(gè)處理機(jī)上運(yùn)行,但任 一個(gè)時(shí)刻點(diǎn)只有一個(gè)程序在處理機(jī)上運(yùn)行。 4.2 創(chuàng)建一個(gè)進(jìn)程 v函數(shù)格式: bool createpr

10、ocess( lpctstr lpapplicationname, lptstr lpcommandline, lpsecurity_attributes lpprocessattributes, lpsecurity_attributes lpthreadattributes, bool binherithandles, dword dwcreationflags, lpvoid lpenvironment, lpctstr lpcurrentdirectory, lpstartupinfo lpstartupinfo, lpprocess_information lpprocessinfo

11、rmation ); v函數(shù)功能: 為新進(jìn)程創(chuàng)建一個(gè)虛擬的地址空間,并將 可執(zhí)行文件或任何必要的dll文件的代碼和數(shù) 據(jù)加載到該進(jìn)程的地址空間中。 啟動(dòng)程序,新進(jìn)程的主線程開始運(yùn)行,并 最終調(diào)用winmain,wwinmain,main,或 wmain。 v返回值: 成功創(chuàng)建了新進(jìn)程或者主線程,返回true, 否則返回0。 v參數(shù)說明: lpapplicationname:新進(jìn)程將要使用的可執(zhí)行文件 的名字,必須包含擴(kuò)展名。 lpcommandline:新進(jìn)程的命令行。若上面第一個(gè) 參數(shù)為null,lpcommandline 的第一個(gè)參數(shù)是新 進(jìn)程將要使用的可執(zhí)行文件的名字,可以不包含擴(kuò)展 名

12、,系統(tǒng)假定是exe文件。 以存于下面路徑的程序?yàn)槔?: c:programfilessubdirprogram.exe v可以采用如下兩種方式: bool flag; flag=createprocess( “c:programfilessubdirprogram.exe ”, null, , ); 或者: flag=createprocess( null, “c:programfilessubdirprogram (.exe) ”, ); lpprocessattributes和lpthreadattributes:分 別是給進(jìn)程對(duì)象和線程對(duì)象指定的安全屬性。 如果設(shè)為null則系統(tǒng)賦予默認(rèn)

13、的安全屬性。 也可以指向一個(gè)security_attributes結(jié)構(gòu),創(chuàng) 建自己的安全性權(quán)限。 binherithandles:指定該進(jìn)程是否繼承其父 進(jìn)程中的句柄。 如果設(shè)為true,則新創(chuàng)建的 進(jìn)程就能繼承父進(jìn)程的任何可繼承句柄。 dwcreationflags:指定新進(jìn)程的優(yōu)先級(jí)類。 表4.1 進(jìn)程優(yōu)先級(jí)類別 優(yōu)先級(jí)類別優(yōu)先級(jí)類別標(biāo)志的標(biāo)識(shí)符 空閑idle_priority_class 低于正常below_normal_priority_class 正常normal_priority_class 高于正常above_normal_priority_class 高h(yuǎn)igh_priorit

14、y_class 實(shí)時(shí)realtime_priority_class lpenvironment:指向含有新進(jìn)程將要使用的 環(huán)境塊字符串的內(nèi)存塊。一般為null,使子 進(jìn)程繼承父進(jìn)程的一組環(huán)境塊。 lpcurrentdirectory:設(shè)置子進(jìn)程的當(dāng)前驅(qū)動(dòng) 器和工作目錄。若為null,子進(jìn)程繼承父進(jìn) 程的當(dāng)前驅(qū)動(dòng)器和工作目錄。 lpstartupinfo:指向startupinfo 的結(jié)構(gòu)。 該結(jié)構(gòu)可用來指定新進(jìn)程中主窗口的出現(xiàn)形 式。一般讓子進(jìn)程使用缺省值null。 lpprocessinformation :指向 process_information結(jié)構(gòu),用來記錄進(jìn)程句柄 及進(jìn)程id號(hào)等信

15、息。createprocess在返回之前,填 入有關(guān)進(jìn)程的信息,父進(jìn)程正是利用該信息監(jiān)測(cè)子進(jìn) 程是否終止。 process_information結(jié)構(gòu)如下: typedef struct _process_information handle hprocess; /新新進(jìn)程的句柄 handle hthread; /新新進(jìn)程的主線程的句柄 dword dwprocessid; /新新進(jìn)程的id號(hào) dword dwthreadid; /新新進(jìn)程的主線程的id號(hào) process_information; v說明: 1) 終止進(jìn)程之前父進(jìn)程必須關(guān)閉子進(jìn)程和它的 主線程的句柄。系統(tǒng)不再需要訪問子進(jìn)程和

16、它的線程時(shí)也應(yīng)該顯式關(guān)閉這些句柄(函數(shù) closehandle)。 2) 創(chuàng)建進(jìn)程函數(shù)產(chǎn)生的新進(jìn)程的句柄及id可分 別從返回參數(shù)lpprocessinfo-hprocess和 lpprocessinfo-dwprocessid中獲得。 4.3 4.3 終止進(jìn)程終止進(jìn)程 ( (三種方法及結(jié)束時(shí)的處理三種方法及結(jié)束時(shí)的處理) ) 1. 主線程的進(jìn)入點(diǎn)函數(shù)返回 始終都應(yīng)該這樣來設(shè)計(jì)應(yīng)用程序,即只有當(dāng) 主線程的進(jìn)入點(diǎn)函數(shù)返回時(shí),它的進(jìn)程才終止。 這是保證所有線程資源能夠得到正確清除的唯一 辦法。 v讓主線程的進(jìn)入點(diǎn)函數(shù)返回,可以確保下列操作 的實(shí)現(xiàn): 該線程創(chuàng)建的任何c+對(duì)象將能使用它們的析構(gòu) 函數(shù)正

17、確地撤消。 操作系統(tǒng)將能正確地釋放該線程的堆棧使用的內(nèi) 存。 系統(tǒng)將進(jìn)程的退出代碼(在進(jìn)程的內(nèi)核對(duì)象中維 護(hù))設(shè)置為進(jìn)入點(diǎn)函數(shù)的返回值。 系統(tǒng)將進(jìn)程內(nèi)核對(duì)象的返回值遞減1。 2.利用exitprocess函數(shù)(程序不能正確將自己清除, 避免使用) void exitprocess( uint uexitcode /exit code for all threads ); 進(jìn)程中的一個(gè)線程調(diào)用該函數(shù)則終止進(jìn)程,并將 函數(shù)的退出代碼設(shè)置為uexitcode。但函數(shù)本身不返 回任何值,進(jìn)程要等到它所有線程終止運(yùn)行后才終止 運(yùn)行。即,進(jìn)程中運(yùn)行的任何其他線程都隨著進(jìn)程而 一道終止。 (exitthre

18、ad終止線程,進(jìn)程將繼續(xù)運(yùn)行) 3.利用 terminateprocess函數(shù) bool terminateprocess( handle hprocess, uint uexitcode ); 任何線程都可以用terminateprocess終 止,但終止進(jìn)程時(shí)不通知dll,因此通常不采 用此方法。 4.進(jìn)程終止時(shí)的結(jié)束處理: 1) 進(jìn)程中剩余的所有線程全部終止運(yùn)行。 2) 進(jìn)程指定的所有用戶對(duì)象和gdi對(duì)象均被釋放,所 有內(nèi)核對(duì)象均被關(guān)閉(如果沒有其他進(jìn)程打開它們 的句柄,那么這些內(nèi)核對(duì)象將被撤消。但是,如果 其他進(jìn)程打開了它們的句柄, 內(nèi)核對(duì)象將不會(huì)撤 消)。 3) 進(jìn)程的退出代碼將從s

19、till_actives改為傳遞給 exitprocess或terminateprocess的代碼。 4) 進(jìn)程內(nèi)核對(duì)象的狀態(tài)變成收到通知的狀態(tài)。系統(tǒng)中 的其他線程可以掛起,直到進(jìn)程終止運(yùn)行。 5) 進(jìn)程內(nèi)核對(duì)象的使用計(jì)數(shù)遞減1。 注意,進(jìn)程的內(nèi)核對(duì)象的壽命至少可以達(dá)到進(jìn)程本 身那么長,但是進(jìn)程內(nèi)核對(duì)象的壽命可能大大超過它的 進(jìn)程壽命。當(dāng)進(jìn)程終止運(yùn)行時(shí),系統(tǒng)能夠自動(dòng)確定它的 內(nèi)核對(duì)象的使用計(jì)數(shù)。 如果使用計(jì)數(shù)降為0,那么沒有 其他進(jìn)程擁有該對(duì)象打開的句柄,當(dāng)進(jìn)程被撤消時(shí),對(duì) 象也被撤消。不過,如果系統(tǒng)中的另一個(gè)進(jìn)程擁有正在 被撤消的進(jìn)程的內(nèi)核對(duì)象的打開句柄,那么該進(jìn)程內(nèi)核 對(duì)象的使用計(jì)數(shù)不會(huì)降

20、為0。 內(nèi)核對(duì)象 v1. 內(nèi)核對(duì)象是系統(tǒng)的一種資源。系統(tǒng)對(duì)象一旦產(chǎn)生,任何應(yīng)用程序都可內(nèi)核對(duì)象是系統(tǒng)的一種資源。系統(tǒng)對(duì)象一旦產(chǎn)生,任何應(yīng)用程序都可 以開啟并且使用該對(duì)象。系統(tǒng)給內(nèi)核對(duì)象一個(gè)計(jì)數(shù)值作為管理之用,內(nèi)以開啟并且使用該對(duì)象。系統(tǒng)給內(nèi)核對(duì)象一個(gè)計(jì)數(shù)值作為管理之用,內(nèi) 核對(duì)象包括:核對(duì)象包括: vevent,mutex,semaphore,file,file-mapping,preocess,thread. 這些內(nèi)這些內(nèi) 核對(duì)象每次產(chǎn)生都會(huì)返回一個(gè)核對(duì)象每次產(chǎn)生都會(huì)返回一個(gè)handle,作為標(biāo)示。每使用一次,對(duì)應(yīng)的計(jì)作為標(biāo)示。每使用一次,對(duì)應(yīng)的計(jì) 數(shù)值加數(shù)值加1,調(diào)用調(diào)用closehand

21、le可以結(jié)束內(nèi)核對(duì)象的使用??梢越Y(jié)束內(nèi)核對(duì)象的使用。 v2.內(nèi)核對(duì)象只能由內(nèi)核所擁有內(nèi)核對(duì)象只能由內(nèi)核所擁有,而不是由進(jìn)程擁有而不是由進(jìn)程擁有.(就是說進(jìn)程沒有了就是說進(jìn)程沒有了,內(nèi)內(nèi) 核還可以被其他進(jìn)程使用核還可以被其他進(jìn)程使用) 3.內(nèi)核對(duì)象的數(shù)據(jù)結(jié)構(gòu)中有計(jì)數(shù)器內(nèi)核對(duì)象的數(shù)據(jù)結(jié)構(gòu)中有計(jì)數(shù)器,進(jìn)程調(diào)用時(shí)進(jìn)程調(diào)用時(shí),計(jì)數(shù)器增計(jì)數(shù)器增1,調(diào)用結(jié)束調(diào)用結(jié)束,計(jì)數(shù)計(jì)數(shù) 器減器減1,內(nèi)核對(duì)象計(jì)數(shù)器為零時(shí)內(nèi)核對(duì)象計(jì)數(shù)器為零時(shí),銷毀此內(nèi)核對(duì)象銷毀此內(nèi)核對(duì)象.(系統(tǒng)來管理內(nèi)核對(duì)象系統(tǒng)來管理內(nèi)核對(duì)象) 內(nèi)核只有一個(gè),內(nèi)核對(duì)象可以有多個(gè)。內(nèi)核只有一個(gè),內(nèi)核對(duì)象可以有多個(gè)。 v 4.4 進(jìn)程通信進(jìn)程通信 4.4.

22、1 概述概述 進(jìn)程間通信進(jìn)程間通信ipc (inter process communication): 在進(jìn)程間傳送數(shù)據(jù)。在進(jìn)程間傳送數(shù)據(jù)。 包括同一臺(tái)計(jì)算機(jī)的不同進(jìn)程之間、不同計(jì)算機(jī)包括同一臺(tái)計(jì)算機(jī)的不同進(jìn)程之間、不同計(jì)算機(jī) 的進(jìn)程之間的通信。的進(jìn)程之間的通信。 比如,多個(gè)進(jìn)程間協(xié)調(diào)工作的時(shí)候,進(jìn)程之間的比如,多個(gè)進(jìn)程間協(xié)調(diào)工作的時(shí)候,進(jìn)程之間的 數(shù)據(jù)交換是必須的。數(shù)據(jù)交換是必須的。 4.4.2 進(jìn)程通信分類進(jìn)程通信分類 vwin32的ipc機(jī)制: netbios,socket 網(wǎng)間ipc機(jī)制的典型應(yīng)用 郵槽,管道,事件, 文件映射 1) 郵槽(mailslot) 單向ipc:將消息傳送或者

23、廣播給其他進(jìn)程 適用區(qū)間:同一計(jì)算機(jī)的不同進(jìn)程之間和不同計(jì) 算機(jī)的進(jìn)程之間 可靠性:不可靠(廣播) 當(dāng)在一個(gè)小范圍內(nèi)需要實(shí)時(shí)發(fā)布(廣播)消息 時(shí),可以利用郵槽。 2) 命名管道(named pipes) 單向或雙向的ipc 適用區(qū)間:同一計(jì)算機(jī)的不同進(jìn)程之間和不同計(jì) 算機(jī)的進(jìn)程之間 可靠性:可靠 3) 事件(events) 雙向ipc 適用區(qū)間:主要用于同一臺(tái)計(jì)算機(jī)上多個(gè)進(jìn)程間通知 一些簡單事件,也用于進(jìn)程同步。 (如:netbios命令的異步調(diào)用方式) 4) 文件映射文件映射(filemapping) 不支持網(wǎng)間通信 同一臺(tái)計(jì)算機(jī)上的多個(gè)進(jìn)程可以利用文件映射 共享數(shù)據(jù)。 單機(jī)多進(jìn)程通信最有效

24、的方法。 4.5 內(nèi)存文件映射內(nèi)存文件映射 拿文件直接當(dāng)作系統(tǒng)的內(nèi)存使用拿文件直接當(dāng)作系統(tǒng)的內(nèi)存使用 作用:作用: 1. 直接用內(nèi)存映射文件來訪問磁盤上的數(shù)據(jù)文件直接用內(nèi)存映射文件來訪問磁盤上的數(shù)據(jù)文件,無需無需 再進(jìn)行文件的再進(jìn)行文件的i/0操作,不必對(duì)文件內(nèi)容進(jìn)行緩存。操作,不必對(duì)文件內(nèi)容進(jìn)行緩存。 2. 用來在多個(gè)進(jìn)程之間共享數(shù)據(jù)。用來在多個(gè)進(jìn)程之間共享數(shù)據(jù)。一個(gè)進(jìn)程使用另一一個(gè)進(jìn)程使用另一 個(gè)進(jìn)程的文件映射對(duì)象在自己的虛擬地址空間中建立個(gè)進(jìn)程的文件映射對(duì)象在自己的虛擬地址空間中建立 一個(gè)相同的視圖,從而共享內(nèi)存,利用這種方式使得一個(gè)相同的視圖,從而共享內(nèi)存,利用這種方式使得 進(jìn)程之間交

25、換數(shù)據(jù)。進(jìn)程之間交換數(shù)據(jù)。 內(nèi)存文件映射的共享數(shù)據(jù)特性內(nèi)存文件映射的共享數(shù)據(jù)特性是進(jìn)程間通信的主是進(jìn)程間通信的主 要手段。要手段。 要利用內(nèi)存文件映射實(shí)現(xiàn)進(jìn)程間通信主要步驟 有如下四步: 1.createfilemapping 創(chuàng)建一個(gè)文件映射內(nèi)核對(duì)象 2.openfilemapping 打開映射對(duì)象 3.mapviewoffile 將文件數(shù)據(jù)映射進(jìn)進(jìn)程地址空間 4.unmapviewoffile 從進(jìn)程地址空間解除這個(gè)映射 4.5.1 內(nèi)存文件映射使用到的函數(shù)內(nèi)存文件映射使用到的函數(shù) 1. 創(chuàng)建內(nèi)存文件映射創(chuàng)建內(nèi)存文件映射(createfilemapping) 函數(shù)創(chuàng)建一個(gè)有名或無名的文件映

26、射對(duì)象,函數(shù)創(chuàng)建一個(gè)有名或無名的文件映射對(duì)象, 成功返回文件映射對(duì)象的句柄,失敗返回成功返回文件映射對(duì)象的句柄,失敗返回null。 handle createfilemapping( handle hfile, /物理文件句柄 lpsecurity_attributes lpattributes, /安全設(shè)置 dword flprotect, /保護(hù)設(shè)置 dword dwmaximumsizehigh, /高位文件大小 dword dwmaximumsizelow, /低位文件大小 lpctstr lpname /共享內(nèi)存名稱 ); 參數(shù)說明如下: hfile:想要映射到地址空間中的文件對(duì)象的

27、句柄。 對(duì)于磁盤文件句柄可以用createfile得到;對(duì)于共享 內(nèi)存區(qū)操作,指定為0 xfffffff 。 lpattributes:安全設(shè)置, 一般設(shè)置為null, 使用默認(rèn) 的安全配置。 flprotect:指定文件映射區(qū)物理存儲(chǔ)器的頁面保護(hù)屬 性??扇∪绫?.2中的三種屬性。 dwmaximumsizehigh和dwmaximumsizelow :指 定該文件映射的最大字節(jié)數(shù)。前者用于設(shè)定較高的 32位,后者設(shè)定較低的32位,一般我們現(xiàn)在所用的 機(jī)器都是32位的,所以高32位置0。 lpname:以0結(jié)尾的字符串,用于給該文件映射對(duì) 象設(shè)置一個(gè)名字。該名字用于與其他進(jìn)程共享文件 映射對(duì)

28、象。 2.打開文件映射對(duì)象openfilemapping 成功則返回文件映射對(duì)象的句柄,否則null。 handle openfilemapping( dword dwdesiredaccess; bool binherithandle; lpctstr lpname ); 參數(shù)說明: dwdesiredaccess:指定對(duì)文件映射對(duì)象的訪 問方式。 binherithandle:指定該文件對(duì)象句柄是否可以 被繼承。(ture,false) lpname:以0結(jié)尾在字符串,用于指定一個(gè)已 經(jīng)創(chuàng)建的文件映射對(duì)象的名字。(系統(tǒng)通過這 個(gè)名字實(shí)現(xiàn)與其他進(jìn)程共享文件映射對(duì)象, 進(jìn)而實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)交換

29、) 3.將文件數(shù)據(jù)映射進(jìn)進(jìn)程地址空間mapviewoffile lpvoid mapviewoffile( handle hfilemappingobject, dword dwdesiredaccess, dword dwfileoffsethigh, dword dwfileoffsetlow, dword dwnumberofbytestomap); 函數(shù)執(zhí)行成功返回進(jìn)程地址空間映射區(qū)的首地址, 否則null。 參數(shù)說明: hfilemappingobject:標(biāo)識(shí)文件映射對(duì)象的句柄,即前面調(diào) 用createfilemapping返回的內(nèi)存文件映像對(duì)象句柄或者 openfilemappi

30、ng函數(shù)所返回的句柄。 dwdesiredaccess:指定文件映射數(shù)據(jù)(視圖)的訪問方式。 表4.3 dwfileoffsethigh和dwfileoffsetlow:指定數(shù)據(jù)文件中的 哪個(gè)字節(jié)作為視圖中的第一個(gè)字節(jié)來映射,即視圖相對(duì)于文 件映射數(shù)據(jù)的位移值或者說偏移量。(分別指明高、低32位)。 dwnumberofbytestomap:映射文件有多少字節(jié)要映射到 地址空間。若為0,則把文件中的指定位移開始到文件的結(jié) 尾的視圖映射到地址空間。 4.釋放地址映射(unmapviewoffile) bool unmapviewoffile( lpcvoid lpbaseaddress); 成功返回非0值,否則返回0。 必須調(diào)用此函數(shù)來釋放地址映射對(duì)象,否則進(jìn)程 終止前,保留的區(qū)域就不會(huì)被釋放。 參數(shù)說明: lpbaseaddress:用于設(shè)定釋放區(qū)域的基地址,必須 與調(diào)用mapviewoffile函數(shù)返回的值相同。 5. 關(guān)閉文件映射對(duì)象(closehandle) boo

溫馨提示

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

評(píng)論

0/150

提交評(píng)論