1. 程式人生 > >Windows上C++使用共享記憶體進行程序間通訊

Windows上C++使用共享記憶體進行程序間通訊

共享記憶體 (也叫記憶體對映檔案) 主要是通過對映機制實現的 , Windows 下程序的地址空間在邏輯上是相互隔離的 , 但在物理上卻是重疊的 ; 所謂的重疊是指同一塊記憶體區域可能被多個程序同時使用 , 當呼叫 CreateFileMapping 建立命名的記憶體對映檔案物件時 , Windows 即在實體記憶體申請一塊指定大小的記憶體區域 , 返回檔案對映物件的控制代碼 hMap ; 為了能夠訪問這塊記憶體區域必須呼叫 MapViewOfFile 函式 , 促使 Windows 將此記憶體空間對映到程序的地址空間中 ; 當在其他程序訪問這塊記憶體區域時 , 則必須使用 OpenFileMapping

函式取得物件控制代碼 hMap , 並呼叫 MapViewOfFile 函式得到此記憶體空間的一個對映 , 這樣系統就把同一塊記憶體區域對映到了不同程序的地址空間中 , 從而達到共享記憶體的目的 , 程式碼如下 :

程序 A 將資料寫入到共享記憶體 :

#include "stdafx.h"
#include <windows.h>
using namespace std;

#define BUF_SIZE 4096

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    // 定義共享資料
    char szBuffer[] = "Hello Shared Memory";

    // 建立共享檔案控制代碼 
    HANDLE hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,   // 物理檔案控制代碼
        NULL,   // 預設安全級別
        PAGE_READWRITE,   // 可讀可寫
        0,   // 高位檔案大小
        BUF_SIZE,   // 地位檔案大小
        L"ShareMemory"   // 共享記憶體名稱
        );

    // 對映快取區檢視 , 得到指向共享記憶體的指標
    LPVOID lpBase = MapViewOfFile(
        hMapFile,            // 共享記憶體的控制代碼
        FILE_MAP_ALL_ACCESS, // 可讀寫許可
        0,
        0,
        BUF_SIZE
        );

    // 將資料拷貝到共享記憶體
    strcpy((char*)lpBase,szBuffer);

    // 執行緒掛起等其他執行緒讀取資料
    Sleep(20000);

    // 解除檔案對映
    UnmapViewOfFile(lpBase);
    // 關閉記憶體對映檔案物件控制代碼
    CloseHandle(hMapFile);
    return 0;
}

程序 B 獲取共享記憶體中的資料 :

#include "stdafx.h"
#include <iostream>  
#include <windows.h>  
using namespace std;  

#define BUF_SIZE 4096

int main()  
{  
    // 開啟共享的檔案物件
    HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,L"ShareMemory");
    if (hMapFile)
    {
        LPVOID lpBase = MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
        // 將共享記憶體資料拷貝出來
        char szBuffer[BUF_SIZE] = {0};
        strcpy(szBuffer,(char*)lpBase);
        printf("%s",szBuffer);

        // 解除檔案對映
        UnmapViewOfFile(lpBase);
        // 關閉記憶體對映檔案物件控制代碼
        CloseHandle(hMapFile);
    }
    else
    {
        // 開啟共享記憶體控制代碼失敗
        printf("OpenMapping Error");
    }
    return 0;
}

個人網站: Github , 歡迎點選給星

相關推薦

WindowsC++使用共享記憶體進行程序通訊

共享記憶體 (也叫記憶體對映檔案) 主要是通過對映機制實現的 , Windows 下程序的地址空間在邏輯上是相互隔離的 , 但在物理上卻是重疊的 ; 所謂的重疊是指同一塊記憶體區域可能被多個程序同時使用

一起talk C栗子吧(第九十五回:C語言例項--使用共享記憶體進行程序通訊一)

各位看官們,大家好,上一回中咱們說的是SystemV IPC結構概述的例子,這一回咱們說的例子是:使用共享記憶體進行程序間通訊。閒話休提,言歸正轉。讓我們一起talk C栗子吧! 共享記憶體是SystemV IPC結構這種抽象概念的一種具體物件。就和它的

Windows or Linux環境下利用“共享記憶體”實現程序通訊C/C++程式碼

程序A對應的程式: #include <iostream> #include <windows.h> using namespace std; #define BUF_SIZE 1025 char szName[] = "NameOfMappi

共享記憶體程序通訊程序同步使用訊號量來實現

Linux 環境下C程式設計指南,通過共享記憶體進行程序間通訊的例子,程序間同步使用訊號量來實現。 程式碼 11-5 使用說明:這是一個簡單的伺服器和客戶端程式,如果啟動程式時不帶引數,則執行伺服器程式; 如果帶引數,則執行客戶端程式,所帶引數只有一個,就是伺服器端所顯

訊號量與共享記憶體實現程序通訊(生產者消費者問題為例)

(一)訊號量訊號量是IPC的一種,可以看做是一個計數器,計數值為可用的共享資源的數量,訊號量可用於多程序的同步,為多個程序提供對共享資源的訪問。linux下的訊號量的介面函式如下:/*(1)獲取訊號量*/int semget(key_t key, int semnum, in

Qt提供通過訪問共享記憶體實現程序通訊

② 通過建構函式QSharedMemory::QSharedMemory (QObject * parent = 0 )構造例項物件,之後呼叫setKey()函式為該例項物件設定關鍵字。例如:QSharedMemory* sharememory;sharememory = new QSharedMemory(

C#使用SendMessage實現程序通訊的方法

本文例項講述了C#使用SendMessage實現程序間通訊的方法。分享給大家供大家參考。具體分析如下: 為了深入理解訊息機制,先來做一個測試專案 在新建專案的Form1的程式碼中,加入方法: ?

Android studio 使用aidl和service進行程序通訊

一.概述 Android的Binder機制可以進行程序間通訊,但是Servicemanager這個類不公開,也就是我在自己的應用程式中無法使用Servicemanager的addService將我們自己定義的service註冊到binder中去,也無法通過

Android如何進行程序通訊之——Binder

一. 為什麼會有Binder 首先我們來看一句話:Binder是Android中使用最廣泛的IPC(程序間呼叫)機制。所以說白了,Binder的存在是為了Android系統中的跨程序函式(包括服務等)呼叫。這是作業系統的基本功能之一。在Android系統中的具體表現形式

linux下使用FIFO進行程序通訊

無名管道應用的一個重大限制是它沒有名字,因此,只能用於具有親緣關係的程序間通訊,在有名管道(named pipe或FIFO)提出後,該限制得到了克服。FIFO不同於管道之處在於它提供一個路徑名與之關聯,以FIFO的檔案形式存在於檔案系統中。這樣,即使與FIFO的建立程序不存在親緣關係的程序,只要可以訪問該

【嵌入式Linux C程式設計】Linux程序通訊——IPC

程序間通訊的作用:資料傳輸; 資源共享; 通知事件; 程序控制。管道通訊管道是單向的,先進先出(FIFO)。將一個程序的輸出和另一個程序的輸入連在一起。輸出程序在管道尾部寫入資料,輸入程序在管道頭部接受資料。資料在被讀出後,將從管道中清楚,其他程序再也無法讀取到該資料。程序試

Python使用Socket 進行程序通訊

毫無關係的兩個程序要通訊,使用socket是比較穩妥的方法。Socket 程序間通訊主要分為 Client 端和 Server 端。Server 端主要是監聽 socket請求,而 Client 端主要是傳送請求,等待 Server 端的回覆。 Server 端: 首先需要

Java通過管道進行程序通訊

Java語言中提供了各種各樣的輸入輸出流Stream,使我們能夠很方便地對資料進行操作,其中管道流(pipeStream)是一種特殊的流,用於在不同執行緒間之間傳送資料。一個執行緒傳送資料到輸出管道,另一個執行緒從輸入管道中讀資料。通過使用管道,實現不同執行緒間

WindowsC++使用共享內存進行進程通訊

strcpy 其他 turn 讀寫 int view 實現 define 能夠 共享內存 (也叫內存映射文件) 主要是通過映射機制實現的 , Windows 下進程的地址空間在邏輯上是相互隔離的 , 但在物理上卻是重疊的 ; 所謂的重疊是指同一塊內存區域可能被多個進程同時

c/c++ linux 程序通訊系列4,使用共享記憶體

linux 程序間通訊系列4,使用共享記憶體 1,建立共享記憶體,用到的函式shmget, shmat, shmdt 函式名 功能描述 shmget 建立共享記憶體,返回pic key

C++:通過C++程式碼簡單理解程序通訊機制:共享記憶體

下面用共享對映檔案的方式實現程序間通訊,程式碼可以執行。 一、淺理解 每個程序有自己獨立的空間,一個程序無法訪問其他程序的資料。就好像兩個是互不干涉的個體,想讓它們進行通訊(交換資料),就必須有一段它們都可以訪問到的空間,作為中間介質。在計算機中,可以存放資料的地方分為記憶體和硬

Linux環境程序通訊(五): 共享記憶體)(轉)

轉自http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html, 作者:鄭彥興採用共享記憶體通訊的一個顯而易見的好處是效率高,因為程序可以直接讀寫記憶體,而不需要任何資料的拷貝。對於像管道和訊息佇列等通訊方式,則需要在內 核和使用者空間

Windows程序通訊-共享記憶體

#include "stdafx.h" #include "windows.h" //Name given to the pipe #define g_szPipeName "\\\\.\\Pipe\\MyNamedPipe" //Pipe name format - \\.\pipe\pipename

Windows程序通訊共享記憶體

之前自己做的一個專案涉及到程序間通訊問題,我採用的是SOCKET方式。面試的時候有問過為什麼不採用其他方式。好吧,其實發現共享記憶體更方便一點。於是自己寫了一下,並且做了個測試介面。 寫的程式可以在這裡下載下載程式 程式啟動會獲得自身的視窗控制代碼,另外可以輸入一個視

ython實現程序通訊有Queue,Pipe,Value+Array等,其中Queue實現多個程序通訊,而Pipe實現兩個程序通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快

1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #新增資料函式 def proc_write(queue,urls): print("程序(%s)正在寫入..."%(os.getpid()))