對於那些熟悉進程間通信的人,我有一個快速的問題。通過內存共享C++對象
形勢
- 我有一個計劃(方案一),我可以添加一些代碼,但非常有限。這是生成大量數據的主要程序。
- 數據的表達方式是有限的,所以我想創建第二個程序(程序B),因此需要從A到B獲取數據。甚至有時會導致A運行一些沒有返回值的函數。
- 我知道命名管道,但我覺得他們可能會體積龐大? - 不知道 - 我有例如以下問題(可能沒有根據):
- 數據流=>轉換爲二進制 - >將數據放在內存中 - >服務器讀取 - >轉換爲字符串 - >通過可能是一個開關語句確定請求 - >獲取請求 - >轉換爲二進制 - >在內存中放置 - >由客戶端讀取並轉換爲字符串/一些可接受的格式。
- 它必須基本上使用雙方的開關語句,如果你想要一個不同於字符串的信息格式,你需要考慮這一點
- 一條消息可能要等待另一條消息完成,所以它在同一時間的很多電話中可能會更慢? - 不確定
- 其他進程間通信方法可能有同樣的問題。
更好的解決方案我認爲會創建一個「對象」類。與程序之間共享對象的內存地址,從而在理論上「合併」 A和B,則:
- 沒有與編碼和解碼的問題等
- 數據只是要求沒有問題/通過調用一個函數調用。
- 函數返回正確的類型,也不需要建立正確的類型是什麼(即布爾/ INT /串/雙等)
我明白,這也有幾個問題,即,如果對象被刪除從內存位置由主/另一個程序訪問它。
問題
- 什麼是解決這一問題的最佳途徑:
- 是否有在C++中調用的選項,讓我寫和從存儲器地址讀?此刻:
- 我可以訪問A和B之間的同一個對象,但是我不能寫/讀,因爲這會拋出異常。那麼基本上我可以通過簡單的調用或者讀寫這個對象嗎?
- 我知道WriteProcessMemory函數 - 但這不是我想要的 - 即我不一定要更改內存值,只是訪問數據/調用B將執行的操作。
- 有沒有一個簡單而簡單的方法呢?我知道一些叫做boost的東西,但是對它不瞭解 - 這是我最好的選擇嗎? - >即我應該調查這是我最好的解決方案嗎?
非常感謝您對此問題的任何建議。
*「我知道一些叫做boost的東西」*。好。但最好的辦法是使用它:http://boost.org。而且......驚喜!有些東西可以幫助你解決問題:[Boost.Interprocess](http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess.html) –
你可以通過管道發送二進制數據就好了。實際上,對於操作系統而言,通過管道的東西是一個原始的字節流。但是你想使用正確的序列化格式。 「Cap'n Proto」如何對您的情況有好處,那麼線格式與內存中的數據相同。 – datenwolf