如何在 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);
如果我有一个大小为 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);