2010-11-18 58 views
3

你什麼時候會選擇在Windows中使用未命名的共享內存?什麼時候會使用Un-named共享內存?

在我看來,消息在線程之間傳遞並不是很有用。我們可以將指向結構/變量的指針傳遞給工作線程,而是將其作爲共享內存來使用,而不是調用CreateFileMapping系統調用。

回答

3

使用未命名共享內存的一個原因是將對文件映射的訪問限制爲僅由那些由創建進程給予處理的進程。這避免了兩個問題:

  • ,知道名字和有足夠的權限創建一個映射文件可以蹲你指定的對象上,防止或者其合法使用干擾任何進程 - 這使得服務拒絕攻擊。
  • 意外而非惡意名稱衝突。

當您不使用名稱時,可以確定只有您想要訪問的進程才能獲取它。從MSDN docs for CreateFileMapping

單個文件映射對象可以 被多個進程通過共享 繼承手柄在過程 創建,複製手柄,或通過 名 打開文件映射對象。

3

段對象(又名「文件映射對象」)不僅用於在進程之間共享內存。部分對象的最明顯的用處是映射文件來做I/O,並且在大多數情況下給出對象名稱並不是很有用。對於未命名的頁面文件支持部分(「共享內存」),您仍然可以讓子進程繼承該句柄,以便他們可以使用這些部分。

+0

究竟你是什麼意思'映射文件做I/O'?如果它像一個文本文件,我們只能通過LPVOID將文件的句柄傳遞給需要它的線程? – aCuria 2010-11-18 12:56:40

+0

我在說你不需要命名的節對象來映射文件。這回答你的問題,對吧? – wj32 2010-11-18 19:23:27

3

您可以跨越進程邊界將句柄傳遞給未命名的對象。也就是說,您可以在應用程序中創建一個未命名的內存映射,然後使用名稱從另一個訪問它,而不使用

查看DuplicateHandle調用,該調用可用於跨越進程邊界將句柄傳遞給未命名的對象。

+0

爲什麼不在這種情況下使用命名對象?使用未命名的優點是否有優勢?只要我們知道共享內存的名稱 – aCuria 2010-11-18 12:53:51

+0

沒有*真實的原因,我們就可以獲得指定的共享內存的句柄,但它確實可以讓您動態創建句柄而不必擔心命名衝突。另外,您不需要在「Golbal」名稱空間中放置對象,並且還可以訪問具有安全權限的對象,以防止其他人打開它。 – 2010-11-18 14:35:23

+0

@aCuria - 我們在客戶服務器應用程序中執行此操作。服務器創建客戶端可以查找的指定共享內存片段。對於每個連接,服務器爲該連接創建一個未命名的共享內存並將其傳遞給句柄。然後客戶端和服務器可以使用未命名的部分進行通信。這允許任何數量的連接到同一臺服務器,每一個都不會影響任何其他服務器。 – 2010-11-18 14:55:31