进程间通信 之 共享内存

进程间通信 之 共享内存


内存共享

内存共享使用到的函数有以下5个:

  1. CreateFileMapping 创建
  2. OpenFileMapping 打开
  3. MapViewOfFile和UnmapViewOfFile 映射挂载卸载,用于读写操作
  4. CloseHandle 关闭

[1]. 被共享方

被共享方即创建者,通过创建共享内存和写入数据供其它程序使用。

#include <windows.h>

#define BUF_SIZE 256
#define SharedName TEXT("Global\\FileMappingObject")

int main()
{
    /* 简化逻辑,不做异常处理 */
    //1.创建共享内存文件
    HANDLE hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // use paging file
        NULL,                    // default security
        PAGE_READWRITE,          // read/write access
        0,                       // maximum object size (high-order DWORD)
        BUF_SIZE,                // maximum object size (low-order DWORD)
        SharedName);             // name of mapping object

    //2.读写共享内存
    LPTSTR pBuf = (LPTSTR)MapViewOfFile(
        hMapFile,            // handle to map object
        FILE_MAP_ALL_ACCESS, // read/write permission
        0,
        0,
        BUF_SIZE);
    CopyMemory((PVOID)pBuf, TEXT("Hi, I'm Frist Process!"), 22 * sizeof(TCHAR));
    UnmapViewOfFile(pBuf);
    
    system("pause");//关闭句柄或应用退出共享内存失效

    //3.关闭共享内存
    CloseHandle(hMapFile);

	return 0;
}

[2]. 共享方

共享方即使用者,通过打开共享内存来读出数据进行使用。

#include <windows.h>

#define BUF_SIZE 256
#define SharedName TEXT("Global\\FileMappingObject")

int main()
{
    /* 简化逻辑,不做异常处理 */
    //1.打开共享内存文件
    HANDLE hMapFile = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,   // read/write access
        FALSE,                 // do not inherit the name
        SharedName);           // name of mapping object

    //2.读写共享内存
    LPTSTR pBuf = (LPTSTR)MapViewOfFile(
        hMapFile,            // handle to map object
        FILE_MAP_ALL_ACCESS, // read/write permission
        0,
        0,
        BUF_SIZE);
    MessageBox(NULL, pBuf, TEXT("Second Process"), MB_OK);
    UnmapViewOfFile(pBuf);

    //3.关闭共享内存
    CloseHandle(hMapFile);

	return 0;
}

总结

共享内存是进程间通信的一种方式,使用的是内存映射的文件(memory-mapped files),其操作和文件的操作十分类似,但有一点需要注意,共享内存需要管理员权限,否则会发送创建失败等情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值