我正在使用 POSIX 共享内存。最初我映射四个共享内存缓冲区。其中之一超出了其分配的大小,因此我调用 mremap:
void * remap_shm(void *old_address, size_t old_size, size_t new_size)
{
void * return_ptr;
return_ptr = mremap(old_address, old_size, new_size, MREMAP_MAYMOVE);
if (return_ptr <= 0){
printf("Error on remap! %s\n", strerror(errno)); }
return return_ptr;
}
这成功地获得了指向新映射的指针,但在重新映射之后,我立即尝试写入旧映射的末尾并收到 SIGBUS 错误。但是,我仍然可以使用新指针从原始缓冲区(第一个 ~8MB)中读取数据,但我无法读取/写入超过原始 ~8MB 的末尾,即使它已被重新映射到更大的大小。
旧内存为 8003584,新内存是该大小的两倍 (16007168)。这些大小甚至是 4,096(页面大小)的倍数。这是从共享对象调用的(如果相关的话)。
我知道内存映射页面可能会发生 SIGBUS 错误,但为什么我会在这里遇到这个错误?一切看起来都正确,如所述 https://www.man7.org/linux/man-pages//man2/mremap.2.html。
感谢您对此的任何想法。