使用共享內存在進程間進行通信

最近在做一個項目要在多個程序間傳遞數據,在網上調研了一番準備采用這種最簡單的方式,總結記錄一下。
在兩個獨立的進程之間如果想要互相通信,我們可以借助一個公共的媒介,例如開辟一個文件作為介質,一個進程往里寫數據,另一個進程從中讀數據,這樣就實現了進程間數據通信,這種方法被稱為“共享外存/共享文件”。本文介紹的的共享內存與其類似,只不過這個公共的介質變成了系統預留(reserve)的進程內的地址空間,有的地方又把這種“共享內存”的方式叫做“內存映射文件”方式。
主要使用的API函數有:

CreateFileMapping
MapViewOfFile
UnmapViewOfFile
CloseHandle

存儲程序,這段代碼通過命令行輸入一個int數字,然后存儲到共享的內存位置:

#include <iostream>
#include <Windows.h>
#include <tchar.h>

static HANDLE __shmem = INVALID_HANDLE_VALUE;
char* __shmbuf = NULL;
static const int SHM_SIZE = 1024;

using namespace std;

int main()
{
    int a;
    __shmem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHM_SIZE, _T("SHARE_MEMORY_ADDR"));
    __shmbuf = (char *)MapViewOfFile(__shmem, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE);

    while(1)
    {
        cin>>a;
        *((int*)__shmbuf) = a;
    }

    UnmapViewOfFile(__shmbuf);
    CloseHandle(__shmem);
    __shmem  = INVALID_HANDLE_VALUE;
    __shmbuf = NULL;
}

讀取程序,這段代碼一直讀取該段地址的數據,發現變化后打印出來:

#include <iostream>
#include <Windows.h>
#include <tchar.h>

static HANDLE __shmem = INVALID_HANDLE_VALUE;
char* __shmbuf = NULL;
static const int SHM_SIZE = 1024;  // 共享內存的大小

using namespace std;

int main()
{
    int LastData = 0;
    __shmem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHM_SIZE, _T("SHARE_MEMORY_ADDR"));
    __shmbuf = (char *)MapViewOfFile(__shmem, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE);

    while(1)
    {
        if(LastData != *((int *)__shmbuf))
        {
            LastData = *((int *)__shmbuf);
            printf("%d\n",LastData);
        }
        Sleep(100);
    }
}

這里就簡單測試一下,unmap和close函數就瞎搞了,實際使用的時候需要加上。(PS:如果使用Qt報錯了,在pro里加上DEFINES-= UNICODE)
如圖,右邊的窗口是在一直從命令行讀取數據然后存儲,左邊窗口顯示數據的變化。


1.PNG

在實際使用中,可以使用結構體等數據類型,方便數據的操作。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一.管道機制(pipe) 1.Linux的fork操作 在計算機領域中,尤其是Unix及類Unix系統操作系統中,...
    Geeks_Liu閱讀 3,725評論 1 9
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,951評論 19 139
  • Android跨進程通信IPC整體內容如下 1、Android跨進程通信IPC之1——Linux基礎2、Andro...
    隔壁老李頭閱讀 15,718評論 19 113
  • 關于Button 文字大小自適應 常用的宏 顏色的宏(隨機色和自定義顏色) 關于cell和tableView
    破夕_____________閱讀 195評論 0 0
  • 1.感恩萍萍邀約,朋友齊聚一堂,把酒言歡。跟朋友在一起無比愉悅輕松。 2.感恩宇宙的眷顧,老公一路平安順利的到家。...
    默沫_閱讀 166評論 0 0