我在c中创建了一个Web服务器。我想要多进程,所以我需要在进程之间共享一些东西。
我使用过共享内存,但有时我的进程因内存违规访问而崩溃。
共享内存的地址可能因进程而异。 Gdb调试似乎不可能(我也试图附加到正在运行的进程,仍然没有太大的成功)。
我已经从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);
}
然后,我会将带有其他东西的HANDLE传递给使用PIPE的衍生过程。
然后,它使用:
打开内存映射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编译器。
答案 0 :(得分:1)
您不能通过管道将句柄传递给其他进程。这不起作用。
来自MSDN:
多个进程可以通过使用单个共享文件映射对象或创建由同一文件支持的单独文件映射对象来共享同一文件的视图。 单个文件映射对象可以由多个进程共享继承创建进程时的句柄,复制句柄或按名称打开文件映射对象。有关更多信息,请参阅 CreateProcess, DuplicateHandle和OpenFileMapping函数。
也是一个很好的信息来源:MSDN on Inheritance。
我建议在lpName
和CreateFileMapping
中创建一个guid并将其用作OpenFileMapping
。