共有メモリが正常に再マップされた直後のSIGBUS

共有メモリが正常に再マップされた直後のSIGBUS

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

これに関するご意見をお寄せいただきありがとうございます。

ベストアンサー1

おすすめ記事