在Linux或其他現代操作系統中,每個進程的內存都受到保護,因此在一個進程中進行瘋狂寫入不會導致其他進程崩潰。現在假設,我們在進程A和進程B之間共享內存。現在說,由於軟錯誤,進程A無意中將某些內容寫入該內存區域。考慮到進程A和進程B都具有對該內存的完全寫入權限,是否有任何方法可以保護這一點?如何保護Linux中進程之間共享的內存
1
A
回答
2
當您致電shm_open
時,您可以將O_RDONLY
標誌傳遞給模式參數。
或者,您可以使用mprotect
將特定頁面標記爲(例如)只讀。你需要兩個進程之間的合作和信任才能做到這一點,B沒有辦法說A不能使用mprotect
來寫入它。
如果您確實想確定其他進程無法干涉,那麼通過管道或套接字進行一些描述通信可能是一個明智的想法。
您還可以使用mmap
來映射某些內容(例如在/dev/shm
?中),如果兩個進程之一作爲單獨的UID運行,則文件權限將無法寫入。例如,如果用戶生產者和組使用者擁有/dev/shm/myprocess
,並且在將映射文件權限設置爲0640之前,使用該UID和GID運行進程,則可以防止第二個進程寫入該進程。
0
您可以在每次寫入時使用簡單的校驗和。因此,當一個進程在讀取操作時檢測到錯誤的校驗和時,這是其他進程失敗的標誌。
+0
您可以使用校驗和,但也要考慮使用信號量,因爲如果沒有某種形式的同步,校驗和本身就是一個糟糕的解決方案。但是你真正想要確定的最好的解決方案是讓一個主機寫入並讀取該內存並通過套接字與它進行通信,以便驗證每次寫入。 – Martin
相關問題
- 1. Linux/x86_64上的進程之間的共享內存
- 2. 進程之間不共享共享內存
- 3. mmap保護標誌對進程之間共享的影響
- 4. 如何在服務和用戶進程之間共享內存?
- 5. 如何在兩個進程之間協調共享內存
- 6. 受保護的共享內存?
- 7. 進程共享內存不共享(c,linux)
- 8. 在Dalvik中的兩個進程之間共享內存
- 9. 2個進程(應用程序)之間的共享內存
- 10. Linux共享內存
- 11. 如何同時保護用戶進程和內核進程的共享資源?
- 12. 共享內存進程間通信
- 13. 在Solaris中的父進程和子進程之間共享內存(在C中)
- 14. 進程如何共享虛擬內存(Linux)
- 15. 如何製作共享內存進程(c,linux)?
- 16. C++和Java進程之間的共享內存
- 17. 在32位和64位進程之間共享共享內存段
- 18. Linux中的共享內存叉進程學習
- 19. 將多進程池內循環(進程間共享內存)
- 20. 通過使用mmap在進程之間共享內存
- 21. 在所有PHP進程之間共享變量/內存
- 22. 在多進程之間共享進程之間的狀態
- 23. 如何在fork或子進程之後創建共享內存?
- 24. 父進程和子進程共享一個IPC共享內存
- 25. 進程間共享內存和pthread_barrier:如何安全?
- 26. Python共享進程之間的鎖
- 27. 如何在linux中列出連接到共享內存段的進程?
- 28. 如何在g-wan中的http請求之間共享內存?
- 29. 父進程和子進程之間共享哪些內存結構?
- 30. Linux:是否可以在進程之間共享代碼?
我知道mprotect,但正如我所說的,它們都具有完全的讀寫訪問權限。對我來說,實現這一點似乎是不可能的,我認爲可靠性是共享存儲系統的一個主要問題。不是嗎? – MetallicPriest
@MetallicPriest更新爲公開呼叫添加'O_RDONLY'標誌。但也有其他解決方案。我會盡快更新。 – Flexo
謝謝awoodland。我想到的一個解決方案是每次訪問共享內存時都使用一個互斥鎖,並且只有在鎖定了互斥鎖時纔給該進程寫入訪問權限。這將減少野外寫入的機會。但是,當共享內存訪問頻率很高時,我認爲這種方案效率很低。 – MetallicPriest