web-dev-qa-db-ja.com

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

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

「プロセスA」にPROT_READ保護付きのmmapedメモリがあります。プロセスAで基になるファイル記述子を閉じ、別のプロセスが後でそのファイルに書き込む場合(mmapを使用せず、シェルで>を使用してstdoutをファイルに単純にリダイレクトするだけ)は、mmapedメモリプロセスAのアドレス空間は影響を受けますか?ページが読み取り専用であることを考えると、変更されないことが期待されます。ただし、マップされたメモリを解析しようとしたときに、無効なメモリアクセス(Non-existent physical address at address 0x[...])の結果として、プロセスAはSIGBUS信号によって終了しています。これは他のプロセスによるバッキングファイルへの書き込みが原因であると思われます。このメモリを他のプロセスから完全に保護するには、MAP_PRIVATEの設定で十分でしょうか?

4
user001

プロセス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.

実際には、他のプロセスによって行われた変更は、少なくとも通常のファイルでは、mmaped領域のコンテンツに反映されているようです。

ただし、マップされたメモリを解析しようとしたときに、無効なメモリアクセス(アドレス0x [...]に存在しない物理アドレス)の結果として、プロセスAがSIGBUS信号によって終了されています。

Mmapされたファイルをトランケートすると、それが起こることを期待しています。

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

いいえ、MAP_PRIVATEは、メモリへの変更がバッキングファイルに伝達されるのを防ぐだけで、その逆は行いません。

5
mosvy