Windows 共享内存实现进程间通讯

这篇具有很好参考价值的文章主要介绍了Windows 共享内存实现进程间通讯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Windows共享内存

windows
使用 CreateFileMappingW , MapViewOfFile 函数实现共享内存的创建和挂载。
使用了 CreateEvent , CreateMutex 函数实现进程间的互斥通讯


创建共享内存 CreateFileMapping

具体介绍: MSDN CreateFileMappingW

具体介绍可以看上方的官方文档这里不过多赘述,不过有一点需要提一下。
CreateFileMapping函数有两种

1.CreateFileMappingW
2.CreateFileMappingA

查了一下资料,好像只有最后一个参数不一样,一个是w_char*的宽字符类型, 一个是 char* 的类型, Windows api 的底层调用好像都是 w_char* 的,CreateFileMappingA 函数只是对字符类型做了一个转换再调用CreateFileMappingW,具体的我也没有仔细了解。

string 转 w_char*

LPCWSTR stringToLPCWSTR(const char* orig)
{
   
	size_t origsize = strlen(orig) + 1;
	const size_t newsize = 100;
	size_t convertedChars = 0;
	wchar_t* wcstring = (wchar_t*)malloc(sizeof(wchar_t) * (strlen(orig) - 1));
	mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);

	return wcstring;
}

下文参数默认为 w_char*

创建一个size大小的命名共享内存对象,名称为filename

HANDLE hMapFile = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
			PAGE_READWRITE, 0, size, filename);
if (m_hMapFile == nullptr)
{
   
		std::cerr << "Failed to create file mapping, error number is " << GetLastError() << std::endl;
		return false;
}

其他进程打开共享内存OpenFileMappingW

HANDLE hMapFile = OpenFileMappingW(INVALID_HANDLE_VALUE, NULL,
			PAGE_READWRITE, 0, size, filename);
if (m_hMapFile == nullptr)
{
   
		std::cerr << "Failed to create file mapping, error number is " << GetLastError() << std::endl;
		return false;
}

注意在程序使用期间 hMapFile 句柄不能关闭,否则会导致其他进程无法访问共享内存


挂载共享内存 MapViewOfFile

使用MapViewOfFile可以获取对应的共享内存指针
具体介绍: MSDN MapViewOfFile

void* startMem = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, size);
if (m_startMam == nullptr)
{
   
		std::cerr << "Failed to map view of file, error number is " << GetLastError() << std::endl;
		return false;
}


windows进程间互斥

创建互斥对象 CreateMutex

具体介绍: MSDN CreateMutex
创建一个名为lockname的命名锁对象

HANDLE pMutex = CreateMutexW(NULL, FALSE, lockname);
if (m_pMutex == nullptr)
{
   
	std::cerr << "CreateMutex:> Error number is " << GetLastError() << std::endl;
	return nullptr;
}

打开互斥锁对象 OpenMutex

HANDLE pMutex = OpenMutexW(NULL, FALSE, lockname);
if (m_pMutex == nullptr)
{
   
	std::cerr << "CreateMutex:> Error number is " << GetLastError() << std::endl;
	return nullptr;
}

加锁 WaitForSingleObject

等待某个事件的发生,这里用来等待并拿取互斥锁的权限
具体介绍: MSDN WaitForSingleObject

WaitForSingleObject(pMutex, INFINITE);

INFINITE表示无限等待时长


解锁 ReleaseMutex

调用进程释放互斥对象的所有权
具体介绍: 文章来源地址https://www.toymoban.com/news/detail-597933.html

到了这里,关于Windows 共享内存实现进程间通讯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 进程间通信之共享内存

    进程间通信之共享内存 共享内存是最快的进程间通信形式,是通过调用系统接口(shmget)由操作系统开辟一块物理内存,然后通过页表映射到进程地址空间中,进而使得用户可以使用这块内存,两个进程间共用一块共享内存通过数据交互就可以建立通信。 未创建共享内存之前

    2024年02月07日
    浏览(38)
  • Linux进程通信——共享内存

    两个进程的PCB创建虚拟地址空间然后映射到物理内存中,每个进程因为是独立的,所以在物理内存中的地址也不同。 那么共享内存是怎么做到的呢? 首先先在物理内存中申请一块内存。 然后讲这块内存通过页表映射分别映射到这两个进程的虚拟地址空间内,让这两个进程都

    2024年02月01日
    浏览(51)
  • 【Linux】进程通信 — 共享内存

    上一章我们由进程通信,引入并讲述了管道,匿名管道和命名管道和匿名管道。本章我们将继续讲解进程通信的另一种方式,通过共享内存的方式来进行进程间的通信。还要学习几个系统调用接口,并用代码实现两个进程通过共享内存来进行通信。目标已经确定,接下来就要

    2024年02月15日
    浏览(44)
  • (26)Linux 进程通信之共享内存(共享储存空间)

    共享内存是System V版本的最后一个进程间通信方式。 共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内

    2024年01月16日
    浏览(46)
  • Linux——进程通信之共享内存

    目录 一.  回顾上文 二.共享内存 1.定义 2.特点: 3.实现步骤: 如下为成功链接共享内存使用权的完整步骤: 4.函数介绍         4.1shmget函数         4.1.2参数介绍                4.2ftok函数:         4.2.1参数介绍                 关于ftok(); shmget();函数的

    2024年02月12日
    浏览(54)
  • Linux多进程数据交换--共享内存

    个人博客地址: https://cxx001.gitee.io 在linux系统开发当中,时常需要在多个进程之间交换数据,在多个进程之间交换数据,有很多方法,但最高效的方法莫过于共享内存。 linux共享内存是通过tmpfs这个文件系统来实现的,tmpfs文件系的目录为/dev/shm,/dev/shm是驻留在内存 RAM 当中的

    2024年02月12日
    浏览(43)
  • 【Linux】进程间通信之共享内存

    共享内存比管道快哦~ 文章目录 前言 一、共享内存的实现原理 二、实现共享内存的代码 总结 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的

    2024年02月03日
    浏览(51)
  • Linux 共享内存mmap,进程通信

    进程间通信是操作系统中重要的概念之一,使得不同的进程可以相互交换数据和进行协作。其中,共享内存是一种高效的进程间通信机制,而内存映射(mmap)是实现共享内存的一种常见方法。 存储映射 I/O 是 一个磁盘文件 与 存储空间中的一个缓冲区相映射 。于是, 当从缓

    2024年02月13日
    浏览(45)
  • 【Linux】进程间通信——管道/共享内存

    进程间通信( Inter-Process Communication,简称IPC )是指不同进程之间进行数据交换和共享信息的机制和技术。在操作系统中,每个进程都是独立运行的,有自己的地址空间和数据,因此进程之间需要一种机制来进行通信,以便彼此协调工作、共享数据或者进行同步操作。 进程间

    2024年02月16日
    浏览(45)
  • 进程间通信--共享内存详解【Linux】

    本文详细讲解了共享内存的原理和使用,并且通过实例代码角度来深度理解共享内存,下面就让我们开始吧。 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包