共享記憶體實現程序間通訊

2021-05-22 01:46:11 字數 1796 閱讀 3293

1) 物理檔案控制代碼

任何可以獲得的物理檔案控制代碼, 如果你需要建立乙個物理檔案無關的記憶體對映也無妨, 將它設定成為 0xffffffff(invalid_handle_value)就可以了.

如果需要和物理檔案關聯, 要確保你的物理檔案建立的時候的訪問模式和"保護設定"匹配, 比如: 物理檔案唯讀, 記憶體對映需要讀寫就會發生錯誤. 推薦你的物理檔案使用獨佔方式建立.

2) 保護設定

就是安全設定, 不過一般設定null就可以了, 使用預設的安全配置. 在win2k下如果需要進行限制, 這是針對那些將記憶體檔案對映共享給整個網路上面的應用程序使用是, 可以考慮進行限制.

3) 高位檔案大小

弟兄們, 我想目前我們的機器都是32位的東東, 不可能得到超過32位程序所能定址的私有32位位址空間, 一般還是設定0吧, 我沒有也不想嘗試將它設定超過0的情況.

4) 低位檔案大小

這個還是可以進行設定的, 不過為了讓其他共享使用者知道你申請的檔案對映的相關資訊, 我使用的時候是在獲得的位址空間頭部新增乙個結構化描述資訊, 記錄記憶體對映的大小, 名稱等, 這樣實際申請的空間就比輸入的增加了乙個頭資訊結構大小了, 我認為這樣類似bstr的方式應該是比較合理的.

5) 共享記憶體名稱

這個就是我今天測試的時候碰壁的禍根, 因為為了對於記憶體進行互斥訪問, 我設定了乙個互斥控制代碼, 而名稱我選擇和命名共享記憶體同名, 之下就是因為他們使用共同的namespace導致了錯誤, 呵呵.

8) 相關服務或者平台的命名保留

terminal services:

命名可以包含 "global" 或者 "local" 字首在全域性或者會話名空間初級檔案對映. 其他部分可以包含任何除了()以外的字元, 可以參考 kernel object name spaces.

);dwdesiredaccess long,帶有字首file_map_***的乙個常數。參考mapviewoffile函式的dwdesiredaccess引數的說明

binherithandle long,如這個函式返回的控制代碼能由當前程序啟動的新程序繼承,則這個引數為true

lpname string,指定要開啟的檔案對映物件名稱

2、共享記憶體實現程序間通訊例項:

程序1:

#define share_memory_size 3145728 //3mb

#define wm_earse_data_write wm_user+110

#define wm_earse_data_read  wm_user+111

typedef struct tagfileinfo

fileinfo;

typedef struct tagearseimagedata

earseimagedata;

if(lpbuffer!=null)

if(lhsharememory1!=null)

程序2:

#define share_memory_size 3145728 //3mb

#define wm_earse_data_write wm_user+110

#define wm_earse_data_read  wm_user+111

typedef struct tagfileinfo

fileinfo;

typedef struct tagearseimagedata

earseimagedata;

5)、用mapviewoffile處理大檔案時,如果檔案過大,如400m,則無法一次性對映入記憶體,否則會出現1132錯誤,即記憶體不足。原因可能為作業系統無法找到連續的記憶體。因此需要通過分頁的方式,逐頁將檔案內容對映到記憶體。

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...