小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Windows共享內(nèi)存示例

 禁忌石 2017-04-11

  共享內(nèi)存主要是通過映射機制實現(xiàn)的。
  Windows 下進程的地址空間在邏輯上是相互隔離的,但在物理上卻是重疊的。所謂的重疊是指同一塊內(nèi)存區(qū)域可能被多個進程同時使用。當調(diào)用 CreateFileMapping 創(chuàng)建命名的內(nèi)存映射文件對象時,Windows 即在物理內(nèi)存申請一塊指定大小的內(nèi)存區(qū)域,返回文件映射對象的句柄 hMap。為了能夠訪問這塊內(nèi)存區(qū)域必須調(diào)用 MapViewOfFile 函數(shù),促使 Windows 將此內(nèi)存空間映射到進程的地址空間中。當在其他進程訪問這塊內(nèi)存區(qū)域時,則必須使用OpenFileMapping 函數(shù)取得對象句柄 hMap,并調(diào)用 MapViewOfFile 函數(shù)得到此內(nèi)存空間的一個映射。這樣一來,系統(tǒng)就把同一塊內(nèi)存區(qū)域映射到了不同進程的地址空間中,從而達到共享內(nèi)存的目的。

下面舉例說明如何將內(nèi)存映射文件用于共享內(nèi)存。
  第一次運行這個例子時,它創(chuàng)建了共享內(nèi)存,并寫入數(shù)據(jù)“This is common data!” 。只要創(chuàng)建共享內(nèi)存的進程沒有關閉句柄hMap,以后運行的程序就會讀出共享內(nèi)存里面的數(shù)據(jù),并打印出來。這就是使用共享內(nèi)存在進程間通信的過程。程序代碼如下。

#include <windows.h>

#include <iostream>

#include <string>

#include <cstring>

using namespace std;


int main()

{

    string strMapName("ShareMemory");                // 內(nèi)存映射對象名稱

    string strComData("This is common data!");        // 共享內(nèi)存中的數(shù)據(jù)

    LPVOID pBuffer;                                    // 共享內(nèi)存指針


    // 首先試圖打開一個命名的內(nèi)存映射文件對象  

    HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, strMapName.c_str());

    if (NULL == hMap)

    {    // 打開失敗,創(chuàng)建之

        hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,

                                   NULL,

                                   PAGE_READWRITE,

                                   0,

                                   strComData.length()+1,

                                   strMapName.c_str());

        // 映射對象的一個視圖,得到指向共享內(nèi)存的指針,設置里面的數(shù)據(jù)

        pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

        strcpy((char*)pBuffer, strComData.c_str());

        cout << "寫入共享內(nèi)存數(shù)據(jù):" << (char *)pBuffer << endl;

    }

    else

    {    // 打開成功,映射對象的一個視圖,得到指向共享內(nèi)存的指針,顯示出里面的數(shù)據(jù)

        pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

        cout << "讀取共享內(nèi)存數(shù)據(jù):" << (char *)pBuffer << endl;

    }


    getchar();            // 注意,進程關閉后,所有句柄自動關閉,所以要在這里暫停


    // 解除文件映射,關閉內(nèi)存映射文件對象句柄

    ::UnmapViewOfFile(pBuffer);

    ::CloseHandle(hMap);

    system("pause");        

    return 0;

}


連續(xù)兩次運行這個程序,它們的輸出結(jié)果如下所示:

功不成,身已退


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多