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
メモリの変更がバックアップファイルに渡されるのを防ぐだけで、その逆ではありません。