POSIX共有メモリを使用しています。最初は4つの共有メモリバッファをマッピングしました。そのうちの1つが割り当てられたサイズを超えるため、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エラーが発生します。ただし、新しいポインタを使用して元のバッファ(最初の〜8 MB)から読み取ることができますが、より大きなサイズに再マップされたにもかかわらず、元の〜8 MBの終わりを超えて読み書きすることはできません。
古いメモリは8003584で、新しいメモリはそのサイズ(16007168)の2倍です。これらのサイズは4,096(ページサイズ)の倍数です。これは共有オブジェクト(該当する場合)から呼び出されます。
メモリマップされたページでSIGBUSエラーが発生する可能性があることを知っていますが、ここでこのエラーが発生するのはなぜですか?説明通り、すべてが正しく見えます。 https://www.man7.org/linux/man-pages//man2/mremap.2.html。
これに関するご意見をお寄せいただきありがとうございます。