如何在 C 中将一个共享内存拆分为 3 个不同大小的 mmap 指针?

How can I split one shared memory into 3 different sized mmap pointers in C?

如果我有一个大小为 1024 的共享内存段,我如何映射它的三个不同大小的区域?我尝试了以下操作,但遇到了段错误。我认为有些地方没有正确对齐,但我似乎无法隔离位置。

fd = shm_open(NAME, FLAGS, MODE);
ftruncate(fd, 1024);
addr0 = mmap(NULL, 50, PROTS, FLAGS, fd, 0);
addr1 = mmap(NULL, 100, PROTS, FLAGS, fd, 50);
addr2 = mmap(NULL, 874, PROTS, FLAGS, fd, 150);

您的偏移量(mmap 的最后一个参数)必须是页面大小 man 的倍数。另外 fruncate 应该是 ftruncate,尽管我假设你引入了那个复制它的拼写错误,否则你的代码不应该编译。

一样,偏移量必须是页面大小的倍数。但是您可能不需要三个单独的 mmap,只需 mmap 一次并使用指向该单个映射的不同偏移量的指针:

fd = shm_open(NAME, FLAGS, MODE);
ftruncate(fd, 1024);
addr0 = mmap(NULL, 1024, PROTS, FLAGS, fd, 0);
addr1 = (void*)((char*)addr0 + 50);
addr2 = (void*)((char*)addr1 + 100);

请记住仅在 addr0 上调用 munmap(此时所有三个指针都将失效)。或者,你从同一个起点 mmap 三次,并分别调整每个指针(这将允许你单独 munmap 每个值,只需确保在原始指针上这样做,而不是调整后的指针指针):

fd = shm_open(NAME, FLAGS, MODE);
ftruncate(fd, 1024);
addr0 = mmap(NULL, 50, PROTS, FLAGS, fd, 0);
char *const baseaddr1 = mmap(NULL, 150, PROTS, FLAGS, fd, 0);
char *const baseaddr2 = mmap(NULL, 1024, PROTS, FLAGS, fd, 0);
addr1 = (void*)(baseaddr1 + 50);
addr2 = (void*)(baseaddr2 + 150);