c - 如何创建共享头内存exe和dll/共享对象

标签 c memory dll shared-memory

我正在用 C 创建一个跨平台共享库。我知道多个操作系统/硬件之间存在很多差异,并且每次添加新操作系统都会增加困惑。为了解决这个问题,我决定创建一个共享对象。在创建共享对象库时我遇到了这个问题,经过研究发现这是共享内存和堆内存的问题。

现在我想创建一个共享对象内存或头内存。因此,相同的内存可以由不同的 EXE 或另一个 DLL/共享对象进程访问。我通过在网络上搜索共享堆内存和其他内容来浏览了许多建议。几乎所有的解决方案都是用C++提供的。但我只想要 C 语言。请让我知道如何在 C 中共享对象内存,以便共享对象创建的对象可以被 exe 使用、销毁或共享。

当前使用 CentOS 6 - GCC 创建共享库并在 Linux、Mac 和 Windows 上进行测试

最佳答案

听起来您使用的是 Windows,在这种情况下,您使用内存映射文件创建共享内存。

首先,使用CreateFileMapping创建内存映射句柄。通过将 API 调用的第一个参数设置为 INVALID_HANDLE_VALUE,您将告诉 Windows 不要将实际文件映射到内存中,而是创建一个共享内存区域。您可以为该区域命名,以便其他进程可以打开该区域。

创建文件映射后,您可以使用MapViewOfFile将共享区域映射到您的地址空间。这将为您返回一个指向共享区域的指针,然后您可以直接写入它。

如果您使用的是 Linux 或 MacOS,那么您将需要使用 mmap使用 MAP_ANONYMOUSMAP_SHARED 标志进行调用(我认为)。

由于没有适用于所有平台的标准 C API,因此您需要包装 API 并使用一些 #ifdef 魔法来选择正确的实现。

关于c - 如何创建共享头内存exe和dll/共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21734735/

相关文章:

c - 为什么 `execv` 不能使用从 char** 到 char* const* 的隐式转换?

c - Errno 无法识别所有文件

c - strcat_s() 是否需要使用 realloc()?

c - 分配 : *** error for object: incorrect checksum for freed object

c - 从控制台应用程序调用 .DLL 函数时遇到问题

c - C中初始化多维数组类似于Fortran

c - C 语言的 UART 通信

java - 如何在 Eclipse 或任何其他平台中有效地格式化巨大的 XML 文件

C++: list 和从不同目录动态加载 DLL

c# - 为什么 WinHttpHandler 在生产服务器上导致 "Unable to load DLL ' api-ms-win-core-localization-l1-2-0.dll'”?