我有一个在内存中生成大量数据的 C 程序,我需要在内存中共享这些数据的一个特定部分,以便另一个进程可以读取它。
我试图用mmap
它来做这件事,但我没有取得太大的成功。这是我的代码:
//Code above generates a pointer to the memory section I need to share, named addr
if (infoBlock->memory_size == 1073741824) { //This is the data block I need to share
int err, fd;
fd = open("/tmp/testOutput", (0_RDWR | 0_CREAT), S_IWUSR);
if (fd < 0) {
perror("Couldn't create output file\n");
goto failedExit;
}
unsigned *p = mmap(addr, 1073741824, PROT_READ, (MAP_SHARED | MAP_FIXED), fd, 0);
if (!p) {perror("mmap failed"); goto failedExit; }
printf("p is now: %p\n", p); //This should point to the shared mapping
printf("%u\n", *p); //Try to print out some data from the mapping
}
运行程序后,我可以看到文件 /tmp/testOutput 在那里,但它的大小为 0。我不确定这是否是内存映射的正常现象,因为它在技术上不是一个文件。此外,我的程序中的所有输出都指向相同的内存地址。
我还可以看到 /proc/PID/maps 中存在的内存映射,并引用了 /tmp/testOutput。
一切似乎都在运行,但是当涉及到取消引用指针时,程序退出了,我假设这是因为我做错了映射,并且指针指向了它不应该指向的东西。
如果有人能发现我做错了什么,或者可以提供一些建议,将不胜感激。
谢谢!