![](/img/trans.png)
[英]mmap a same file in both C and Python, will it really use the shared memory? will mmap work across different programming languages?
[英]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.