windows 共享内存出现奇怪错误

Strange error on in windows Shared memory

我正在用 c 语言创建一个网络服务器。我想要多进程,所以我需要在进程之间共享一些东西。

我使用过共享内存,但有时我的进程会因内存违规访问而崩溃。

共享内存的地址可能因进程而异。 Gdb 调试似乎不可能(我也尝试附加到 运行ning 进程,但仍然没有成功)。

我已经从 Microsoft 站点下载了示例代码,尝试 运行 它并发现在每个 运行 处指向内存地址的指针都是不同的。

我有一个主进程,每隔几毫秒检查是否有两个进程处于活动状态。每个进程服务一个客户端,然后死掉。

行为是这样的:有时,当我 运行 程序时,它会在第一次尝试使用共享内存时崩溃。有时需要许多重新生成的进程才能使程序崩溃。仅需一个派生进程,每次都能正常运行。

实际上这只是 Linux 服务器的一个移植程序,所以我不认为我在其他地方的指针做错了什么。

这是在主进程上创建内存映射的代码:

SECURITY_ATTRIBUTES security = { 
    sizeof(security), NULL, TRUE
};

hSharedMemory = CreateFileMapping(
             INVALID_HANDLE_VALUE,    // use paging file
             &security,               // Handle ereditabile
             PAGE_READWRITE| SEC_NOCACHE | SEC_COMMIT,          // read/write access
             0,                       // maximum object size (high-order DWORD)
             region_sz,               // maximum object size (low-order DWORD)
             NULL);                 // name of mapping object
if (hSharedMemory == NULL)
{
    printf("CreateFileMapping: %lu", GetLastError());
    exit(EXIT_FAILURE);
}

然后我将使用 PIPE 将 HANDLE 和其他东西传递给生成的进程。

然后,它使用以下方式打开内存映射:

ptr = MapViewOfFile(hSharedMemory,   // handle to map object
                    FILE_MAP_ALL_ACCESS, // read/write permission
                    0,
                    0,
                    region_sz);

我已经阅读了 msdn 文档,但找不到任何关于为什么会发生这种情况的想法。

在创建进程时,我已将 handle inerithance 参数设置为 TRUE。

我在 Windows 8.1 上使用 mingw 编译器。

您不能只通过管道将句柄传递给其他进程。这不起作用。

来自MSDN

Multiple processes can share a view of the same file by either using a single shared file mapping object or creating separate file mapping objects backed by the same file. A single file mapping object can be shared by multiple processes through inheriting the handle at process creation, duplicating the handle, or opening the file mapping object by name. For more information, see the CreateProcess, DuplicateHandle and OpenFileMapping functions.

也是一个很好的信息来源:MSDN on Inheritance

我建议创建一个 guid 并将其用作 CreateFileMappingOpenFileMapping 中的 lpName