Windows上C++使用共享記憶體進行程序間通訊
共享記憶體 (也叫記憶體對映檔案) 主要是通過對映機制實現的 , Windows 下程序的地址空間在邏輯上是相互隔離的 , 但在物理上卻是重疊的 ; 所謂的重疊是指同一塊記憶體區域可能被多個程序同時使用 , 當呼叫 CreateFileMapping
建立命名的記憶體對映檔案物件時 , Windows 即在實體記憶體申請一塊指定大小的記憶體區域 , 返回檔案對映物件的控制代碼 hMap ; 為了能夠訪問這塊記憶體區域必須呼叫 MapViewOfFile
函式 , 促使 Windows 將此記憶體空間對映到程序的地址空間中 ; 當在其他程序訪問這塊記憶體區域時 , 則必須使用 OpenFileMapping
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 , 歡迎點選給星
相關推薦
Windows上C++使用共享記憶體進行程序間通訊
共享記憶體 (也叫記憶體對映檔案) 主要是通過對映機制實現的 , 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)是一種特殊的流,用於在不同執行緒間之間傳送資料。一個執行緒傳送資料到輸出管道,另一個執行緒從輸入管道中讀資料。通過使用管道,實現不同執行緒間
Windows上C++使用共享內存進行進程間通訊
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()))