文件映射允许进程将文件的内容视为进程虚拟地址空间中的内存块。可以通过简单的指针操作来实现对文件内容的修改。
当多个进程使用同一个file mapping,就可以实现进程间通信。当然,需要有同步机制(如信号量,互斥锁,事件等)进行保护,否则会发生数据错乱。共享内存,是file mapping的一个特殊实现。
// 创建一个想共享的文件数据句柄
HANDLE CreateFileMapping(
HANDLE hFile, //物理文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
DWORD flProtect, //保护设置
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
LPCTSTR lpName //共享内存名称
);
// 打开一个已经存在的共享文件
HANDLE OpenFileMappingW(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCWSTR lpName
);
// 获取共享的内存地址
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);
// 卸载内存映射文件地址指针
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress
);
// 把文件映射视图中的修改的内容或全部写回到磁盘文件中
BOOL FlushViewOfFile(
LPCVOID lpBaseAddress,
SIZE_T dwNumberOfBytesToFlush
);
Demo:
svn://gitee.com/sudaidai/Knowledge_List_of_C
文件夹路径:WindowsAPI/File Mapping