C
mmap:其他程序寫入以前只讀映射的文件的影響
我試圖了解當
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
只防止對記憶體的修改被傳遞到支持文件,而不是相反。