C 共享記憶體實現(windows和linux)

2021-08-26 02:41:52 字數 2381 閱讀 2669

共享記憶體是一種程序間通訊的方式,速度比較快

基本原理:以頁面為單位,將乙個普通檔案對映到記憶體中,達到共享記憶體和節約記憶體的目的,通常在需要對檔案進行頻繁讀寫時使用,這樣用記憶體讀寫取代i/o讀寫,以獲得較高的效能

windows和linux都提供了原生的系統級的c++介面,可以將檔案對映到記憶體

linux使用mmap

**示例

這裡實現了兩個程序,writer程序往共享記憶體裡寫資料,reader程序從共享記憶體裡讀資料

main_writer.cpp

#include 

#include

#include

#include

#ifdef _win32

#include

#elif __linux

#include

#include

#include

#include

#endif

using

namespace

std;

#ifdef _win32

struct mydata

};void writememory()

else

cout

<< endl;

}#elif __linux

struct mydata

;void writememory()

; // create mmap file

int fd = open(shared_file_name, o_creat | o_rdwr | o_trunc, 00777);

if (fd < 0)

cout

<< "create file error"

<< endl;

size_t write_size = sizeof(share_buffer);

ftruncate(fd, write_size); // extend file size

// map memory to file

void *p = mmap(null, write_size, prot_read | prot_write, map_shared, fd, 0);

// copy data to shared memory

memcpy(p, &share_buffer, write_size);

cout

<< "already write to shared memory, wait ..."

<< endl;

//cout << share_buffer << endl;

this_thread::sleep_for(chrono::seconds(10));

// unmap and close

munmap(p, write_size);

close(fd);

}#endif

int main()

main_reader.cpp

#include 

#include

#ifdef _win32

#include

#elif __linux

#include

#include

#include

#include

#endif

using

namespace

std;

#ifdef _win32

struct mydata

};void readmemory()

;//strcpy(share_buffer, (char *)lp_base);

char *share_buffer = (char *)lp_base;

cout

<< share_buffer << endl;

/*mydata *my_data = (mydata *)lp_base;

cout << my_data->name << " " << my_data->age << endl;*/

// close share memory file

unmapviewoffile(lp_base);

closehandle(shared_file_handler);

}else

cout

<< endl;

}#elif __linux

struct mydata

;void readmemory()

#endif

int main()

注意:

Windows共享記憶體

windows共享記憶體可以讓兩個程序對同一塊記憶體進行讀寫。a.cpp include include include include include using namespace std define buf size 256tchar szname text 指向同一塊共享記憶體的名字 in...

Windows共享記憶體示例

windows共享記憶體可以讓兩個程序對同一塊記憶體進行讀寫。a.cpp include include include include include using namespace std define buf size 256tchar szname text 指向同一塊共享記憶體的名字 in...

Windows共享記憶體示例

windows共享記憶體示例 共享記憶體主要是通過對映機制實現的。下面舉例說明如何將記憶體對映檔案用於共享記憶體。第一次執行這個例子時,它建立了共享記憶體,並寫入資料 this is common data 只要建立共享記憶體 的程序沒有關閉控制代碼hmap,以後執行的程式就會讀出共享記憶體裡面的資...