mmap:以前に読み取り専用にマップされたファイルに書き込む他のプロセスの影響

mmap:以前に読み取り専用にマップされたファイルに書き込む他のプロセスの影響

mmapシステムコールを介してメモリにマップされたファイルが後で別のプロセスによって書き込まれると、何が起こるかを理解したいと思います。

「Process A」でmmapメモリが保護されています。PROT_READプロセスAでデフォルトのファイルディスクリプタを閉じて他のプロセスが後でそのファイルに書き込む場合(使用されていない場合は、mmap単にstdoutを>シェルで使用されるファイルにリダイレクト)、mmapプロセスAのアドレス空間にあるedメモリが影響を受けますか?このページは読み取り専用なので変更されないことを願っています。ただし、マッピングされたメモリの解析中に、SIGBUS誤ったメモリアクセス()による信号によってプロセスAが終了します。Non-existent physical address at address 0x[...]私はこれがサポートファイルに書き込む他のプロセスによって引き起こされたと思います。MAP_PRIVATEこのメモリを他のプロセスから完全に保護するのに十分な設定ですか?

答え1

プロセスAでデフォルトのファイル記述子を閉じると

ファイル記述子を閉じても全く変わりません。

後で別のプロセスがファイルに書き込みます(mmapを使用せずに単にシェルで>を使用してstdoutをファイルにリダイレクトします)。プロセスAのアドレス空間のmmapedメモリが影響を受けますか?

おそらくそうです。マンページは次のようにmmap(2)述べています。

 MAP_PRIVATE
    ...
    It is  unspecified  whether changes made to the file
    after the mmap() call are visible in the mapped region.

実際、少なくとも通常のファイルの場合、他のプロセスによって変更された内容は、マップされた領域の内容に反映されるようです。

ただし、マッピングされたメモリを解決しようとすると、誤ったメモリアクセスが原因でプロセスAがSIGBUS信号によって終了します(アドレス0x [...]に物理アドレスがありません)。

マッピングファイルを切り捨てると、これが起こると予想しました。

MAP_PRIVATEこのメモリを他のプロセスから完全に保護するのに十分な設定ですか?

いいえ。MAP_PRIVATEメモリの変更がバックアップファイルに渡されるのを防ぐだけで、その逆ではありません。

関連情報