【发布时间】:2018-09-09 02:02:10
【问题描述】:
在我的应用程序中,我需要共享内存
父母和孩子之间(使用fork+execl)。
我使用memfd_create 来分配内存,因为它提供了一个
文件描述符,可以方便地在child中使用
进程(在execl 之前,描述符通过dup2 绑定到标准输入)
附加到分配的内存。
我不使用 write 和 read - 我使用指针
直接读写内存。
唯一需要解决的难题
是如何获取内存的地址,分配
通过fd = memfd_create ...。
使用mmap 是不可取的,因为它复制了内存,而不是提供
memfd_create已经分配了内存地址。
以下代码证明了这一点。
在其输出中,每个mmap 地址都增加了4096,这是内存的大小,由fd 引用:
0x7f98411c1000
0x7f98411c0000
而如果mmap 给出了直接地址,
输出中的地址将是相同的。
#include <stdio.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <unistd.h>
int main(void)
{
int fd = syscall(SYS_memfd_create, "shm", 0);
if (fd == -1) return 1;
size_t size = 4096; /* minimal */
int check = ftruncate(fd, size);
if (check == -1) return 1;
void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) return 1;
void *ptr2 = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr2 == MAP_FAILED) return 1;
printf("%p\n%p\n", ptr, ptr2);
return 0;
}
那么,如何获取直接地址,避免内存重复
mmap?
【问题讨论】:
标签: shared-memory mmap