2011-08-27 181 views
1

在Linux或其他現代操作系統中,每個進程的內存都受到保護,因此在一個進程中進行瘋狂寫入不會導致其他進程崩潰。現在假設,我們在進程A和進程B之間共享內存。現在說,由於軟錯誤,進程A無意中將某些內容寫入該內存區域。考慮到進程A和進程B都具有對該內存的完全寫入權限,是否有任何方法可以保護這一點?如何保護Linux中進程之間共享的內存

回答

2

當您致電shm_open時,您可以將O_RDONLY標誌傳遞給模式參數。

或者,您可以使用mprotect將特定頁面標記爲(例如)只讀。你需要兩個進程之間的合作和信任才能做到這一點,B沒有辦法說A不能使用mprotect來寫入它。

如果您確實想確定其他進程無法干涉,那麼通過管道或套接字進行一些描述通信可能是一個明智的想法。

您還可以使用mmap來映射某些內容(例如在/dev/shm?中),如果兩個進程之一作爲單獨的UID運行,則文件權限將無法寫入。例如,如果用戶生產者和組使用者擁有/dev/shm/myprocess,並且在將映射文件權限設置爲0640之前,使用該UID和GID運行進程,則可以防止第二個進程寫入該進程。

+0

我知道mprotect,但正如我所說的,它們都具有完全的讀寫訪問權限。對我來說,實現這一點似乎是不可能的,我認爲可靠性是共享存儲系統的一個主要問題。不是嗎? – MetallicPriest

+1

@MetallicPriest更新爲公開呼叫添加'O_RDONLY'標誌。但也有其他解決方案。我會盡快更新。 – Flexo

+0

謝謝awoodland。我想到的一個解決方案是每次訪問共享內存時都使用一個互斥鎖,並且只有在鎖定了互斥鎖時纔給該進程寫入訪問權限。這將減少野外寫入的機會。但是,當共享內存訪問頻率很高時,我認爲這種方案效率很低。 – MetallicPriest

0

您可以在每次寫入時使用簡單的校驗和。因此,當一個進程在讀取操作時檢測到錯誤的校驗和時,這是其他進程失敗的標誌。

+0

您可以使用校驗和,但也要考慮使用信號量,因爲如果沒有某種形式的同步,校驗和本身就是一個糟糕的解決方案。但是你真正想要確定的最好的解決方案是讓一個主機寫入並讀取該內存並通過套接字與它進行通信,以便驗證每次寫入。 – Martin

相關問題