进程通信——共享内存
对共享内存的理解
共享内存,就是一块由内核管理的物理内存,但是在不同进程间是可以调用API来得到自己进程相应HANDLE,因此可以对其进行读写、修改、执行(视获取方式)。其实在这里作为grean hand的我一开始就没弄懂虚拟地址和物理地址,其实每一个进程用的地址都是虚拟地址,即使是核心对象HANDLE,都是OS给出的虚拟地址。这样说清楚,我们就可以清晰地理解共享内存到是怎么“存放”的。这对共享内存中放置指针,而指针到底指向哪里也可以解释通。
windows下将要用到的API
//用来创建共享内存API
①HANDLE CreateFileMapping(HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD fProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);
hFile//CreateFileMapping本来是用作磁盘文件映射到内存的,这里没有实际的文件,我们只是需要一个内存的映射,所以这里设为0xFFFFFFFF
lpFileMappingAttributes//安全属性,具体查MSDN,这里我们不做特别要求,就设为NULL
fProtect//文件的读取方式(保护),PAGE_XXXX
dwMaximumSizeHigh//映射区大小的高32位,因为用不到,这里设为0
dwMaximumLow//映射区大小的低32位,这里就视你需要用到的虚拟内存而定了
lpName//共享内存的名字,不同进程之间要调用这块内存就需要用这个唯一值来调用,所以,设一个能记而又有意义的名字吧
//获取共享内存的地址,转换为自己设定的结构(当然系统类型也行的)
②LPVOID MapViewOfFile(HANDLE hFileMappingObject,
DWORD dwDisiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap