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