gpt4 book ai didi

c - Windows 共享内存中的奇怪错误

转载 作者:行者123 更新时间:2023-11-30 15:14:59 25 4
gpt4 key购买 nike

我正在用 c 创建一个 Web 服务器。我想要它是多进程的,所以我需要在进程之间共享一些东西。

我使用了共享内存,但有时我的进程会因内存冲突访问而崩溃。

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

我从微软网站下载了示例代码,尝试运行它,发现每次运行时指向内存地址的指针都是不同的。

我有一个主进程,每隔几毫秒检查是否有两个进程处于事件状态。每个进程服务一个客户端,然后消亡。

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

实际上,这个程序只是 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 文档,但找不到任何关于发生这种情况的原因。

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

我使用的是带有 mingw 编译器的 Windows 8.1。

最佳答案

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

来自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

关于c - Windows 共享内存中的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33799012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com