繁体   English   中英

如何在 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);

正如Adam Martin 所指出的,偏移量必须是页面大小的倍数。 但是您可能不需要三个单独的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);

您的偏移量( mmap最后一个参数)必须是页面大小man的倍数。 fruncate应该是ftruncate ,虽然我假设你引入了复制这个的错字,否则你的代码不应该编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM