在我的应用程序中我需要共享内存
父母和孩子之间(使用fork
+execl
)。
我用memfd_create
分配内存,因为它提供了
文件描述符,可以方便地在子进程中使用
进程(描述符通过dup2
before execl
)
附加到分配的内存。
我不使用write
and read
- 我使用指针
直接读写内存。
唯一有待解决的难题
就是如何获取分配的内存地址
通过fd = memfd_create ...
.
Using 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
?