C

mmap:其他程序寫入以前只讀映射的文件的影響

  • May 19, 2019

我試圖了解當mmap系統呼叫已映射到記憶體的文件隨後被其他程序寫入時會發生什麼。

我在“程序A”中對mmap記憶體進行了保護。PROT_READ如果我關閉程序 A 中的底層文件描述符,然後另一個程序寫入該文件(不使用mmap; 只是將 stdout 簡單重定向到>shell 中使用的文件),mmap程序 A 的地址空間中的 ed 記憶體是否受影響? 鑑於這些頁面是只讀的,我希望它們不會改變。但是,在嘗試解析映射的記憶體時,SIGBUS由於無效的記憶體訪問 ( ) ,程序 A 被信號終止。Non-existent physical address at address 0x[...]我懷疑這是由其他程序寫入支持文件引起的。設置MAP_PRIVATE是否足以完全保護此記憶體免受其他程序的影響?

如果我關閉程序 A 中的底層文件描述符,

關閉文件描述符根本不會改變任何東西

另一個程序稍後寫入該文件(不使用 mmap;只是在 shell 中使用 > 將 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 信號終止

$$ … $$) 嘗試解析映射記憶體時。

我希望在您截斷 mmaped 文件時會發生這種情況。

設置MAP_PRIVATE是否足以完全保護此記憶體免受其他程序的影響?

不,MAP_PRIVATE只防止對記憶體的修改被傳遞到支持文件,而不是相反。

引用自:https://unix.stackexchange.com/questions/519850