使用内存映射文件在进程间传递数据流(开发笔记)
2010-04-08 16:25
477 查看
有关内存映射(注意,是有关,没说要全部用上)的六个函数:
CreateFileMapping
MapViewOfFile
FlushViewOfFile
UnmapViewOfFile
OpenFileMapping
CloseHandle
用于保护共享资源的内核变量,可以用Mutex, Event,等,网上有人用消息,但只局限于能接收消息的进程。我选了Mutex。
与Mutex有关的五个函数:
CreateMutex
OpenMutex
WaitForSingleObject
LeaveSingleObject
CloseHandle
要注意的:
1. CreateFileMapping –
因为我们不去映射物理文件(没有物理文件,而且为了传递的效率,也不推荐用物理文件),第一个参数必须是INVALID_HANDLE_VALUE。
MSDN是这样说的: CreateFileMapping creates a file mapping object of a
specified size that is backed by the system paging file。
(CreateFileMapping从系统页上创建一个给定大小的文件映射对象)。
实际上,CreateFileMapping只是告诉系统保留一块内存区域,注意,是保留,并未指定。我的理解是:CreateFileMapping告诉系统“我要用一块XXX大小的内存,请帮我看看能给我这么大不?”,要强调的是,调用CreateFileMapping后,系统并未承诺给你哪一块内存。打个比方:如果你想要一块1024bytes的内存,而在调用CreateFileMapping时,系统有两块大于1024bytes的连续的物理内存A和B,系统有可能给你用A,也有可能给你用B,也有可能都不是。这要到调用MapViewOfFile时才能决定。
返回的handle指向一个结构体实例的地址。该结构体描述了要保留的内存区域的大小,内存区域的首地址(此时尚未设置),等等。
2. MapViewOfFile – 拿到物理内存首地址。
必须要注意的是,MapViewOfFile会在当前满足条件(连续且不小于所请求大小)的若干个内存块中选一个返回给你,也就是说:不要以为CreateFileMapping后,即使频繁地调用MapViewOfFile/UnmapViewOfFile,你总能操作同一块内存。
可以这样理解:CreateFileMapping和MapViewOfFile分两步作了和new一块内存相同的事情。
MapViewOfFile后,handle(由CreateFileMapping返回)指向的结构体的一些成员的值会被更新,如设置内存首地址等。
3. UnmapViewOfFile –
就象delete一样,将MapViewOfFile返回的内存区域释放给操作系统。与delete不同的是,如果当前只有这一块内存,系统在你调用CloseHandle关闭handle(由CreateFileMapping返回)或进程退出前,这块内存不会被别人申请走,它会留下来给你。但delete后,别人有可能拿走。但是,如果当前不只剩一块大小合适的内存,系统就不能保证这块内存不被别人拿走了。
4. FlushViewOfFile – 将更改从内存提交到物理文件。我们这里不用物理文件,所以用不着这个函数。
MSDN有一个例子,我认为它是错的:
ms-help://MS。VSCC.v90/MS.MSDNQTR.v90.en/memory/base/creating_named_shared_memory.htm
要传递数据从进程A到进程B,上述函数的调用序列如下:
进程A
[3].gif]
![](https://nvhxyw.bay.livefilestore.com/y1mIRxYFPSmhuhzS6_zKGkNGnPVVCvAhdfg59MJZ_xRvhiZzhOQJEG77HEkWUukcf93tYnwPD-hCdryB2QEXIayoM-wtyCzKIFGkeEaDU-vF7h2WasehAVOgV_Ta8TkGkDMMd_FMWXLuJw83DMe4bra2g/clip_image002[8]_thumb[1].gif)
进程B:
[3].gif]
![](https://nvhxyw.bay.livefilestore.com/y1mo28x-K0QbEsnnt_6wP0pSyXjwHbssQF1gQQO8HQ8hqeV1bCj9rJRgbGZN8acpCYYkDSFg4L0WNt2CA0mVzlIgh3hVBgnnhY4s4T6KzCNhjrNis1htttFEudlcFQkkLd_qFmp1A4vGvdzV7WBuQWhLg/clip_image004[6]_thumb[1].gif)
进程A
.gif]
![](https://nvhxyw.bay.livefilestore.com/y1mUvXSB_CSuU-Fc0oY3qUK9fPiVuwplB3WOnNROgG2_1ydXeqlfwjnA_4_LYQmffVXsFyaejpFRvBz5PCfbKVlWIsqs8pW6piZ4oTLs5949brGIRxKA2GRSgrS5EAaetiHN0DE6Enjg6U3MkU8-kqu5Q/clip_image002_thumb[4].gif)
进程B:
.gif]
![](https://nvhxyw.bay.livefilestore.com/y1mM-RamXym4oN99cmnz_sSD_yiNNkMvK1ulanNp-kjx2DGFk2b8qwrGmyjisEHrtG2_SxmIWgIBqRQHZkvzWcbsh5s37y9OB2Y7uEEj6MW1HqSmU3JjMhiq2O68gTE0ZVAfD-M52eg8NEF02ubee4lcg/clip_image004_thumb[2].gif)
CreateFileMapping
MapViewOfFile
FlushViewOfFile
UnmapViewOfFile
OpenFileMapping
CloseHandle
用于保护共享资源的内核变量,可以用Mutex, Event,等,网上有人用消息,但只局限于能接收消息的进程。我选了Mutex。
与Mutex有关的五个函数:
CreateMutex
OpenMutex
WaitForSingleObject
LeaveSingleObject
CloseHandle
要注意的:
1. CreateFileMapping –
因为我们不去映射物理文件(没有物理文件,而且为了传递的效率,也不推荐用物理文件),第一个参数必须是INVALID_HANDLE_VALUE。
MSDN是这样说的: CreateFileMapping creates a file mapping object of a
specified size that is backed by the system paging file。
(CreateFileMapping从系统页上创建一个给定大小的文件映射对象)。
实际上,CreateFileMapping只是告诉系统保留一块内存区域,注意,是保留,并未指定。我的理解是:CreateFileMapping告诉系统“我要用一块XXX大小的内存,请帮我看看能给我这么大不?”,要强调的是,调用CreateFileMapping后,系统并未承诺给你哪一块内存。打个比方:如果你想要一块1024bytes的内存,而在调用CreateFileMapping时,系统有两块大于1024bytes的连续的物理内存A和B,系统有可能给你用A,也有可能给你用B,也有可能都不是。这要到调用MapViewOfFile时才能决定。
返回的handle指向一个结构体实例的地址。该结构体描述了要保留的内存区域的大小,内存区域的首地址(此时尚未设置),等等。
2. MapViewOfFile – 拿到物理内存首地址。
必须要注意的是,MapViewOfFile会在当前满足条件(连续且不小于所请求大小)的若干个内存块中选一个返回给你,也就是说:不要以为CreateFileMapping后,即使频繁地调用MapViewOfFile/UnmapViewOfFile,你总能操作同一块内存。
可以这样理解:CreateFileMapping和MapViewOfFile分两步作了和new一块内存相同的事情。
MapViewOfFile后,handle(由CreateFileMapping返回)指向的结构体的一些成员的值会被更新,如设置内存首地址等。
3. UnmapViewOfFile –
就象delete一样,将MapViewOfFile返回的内存区域释放给操作系统。与delete不同的是,如果当前只有这一块内存,系统在你调用CloseHandle关闭handle(由CreateFileMapping返回)或进程退出前,这块内存不会被别人申请走,它会留下来给你。但delete后,别人有可能拿走。但是,如果当前不只剩一块大小合适的内存,系统就不能保证这块内存不被别人拿走了。
4. FlushViewOfFile – 将更改从内存提交到物理文件。我们这里不用物理文件,所以用不着这个函数。
MSDN有一个例子,我认为它是错的:
ms-help://MS。VSCC.v90/MS.MSDNQTR.v90.en/memory/base/creating_named_shared_memory.htm
要传递数据从进程A到进程B,上述函数的调用序列如下:
进程A
[3].gif]
![](https://nvhxyw.bay.livefilestore.com/y1mIRxYFPSmhuhzS6_zKGkNGnPVVCvAhdfg59MJZ_xRvhiZzhOQJEG77HEkWUukcf93tYnwPD-hCdryB2QEXIayoM-wtyCzKIFGkeEaDU-vF7h2WasehAVOgV_Ta8TkGkDMMd_FMWXLuJw83DMe4bra2g/clip_image002[8]_thumb[1].gif)
进程B:
[3].gif]
![](https://nvhxyw.bay.livefilestore.com/y1mo28x-K0QbEsnnt_6wP0pSyXjwHbssQF1gQQO8HQ8hqeV1bCj9rJRgbGZN8acpCYYkDSFg4L0WNt2CA0mVzlIgh3hVBgnnhY4s4T6KzCNhjrNis1htttFEudlcFQkkLd_qFmp1A4vGvdzV7WBuQWhLg/clip_image004[6]_thumb[1].gif)
进程A
.gif]
![](https://nvhxyw.bay.livefilestore.com/y1mUvXSB_CSuU-Fc0oY3qUK9fPiVuwplB3WOnNROgG2_1ydXeqlfwjnA_4_LYQmffVXsFyaejpFRvBz5PCfbKVlWIsqs8pW6piZ4oTLs5949brGIRxKA2GRSgrS5EAaetiHN0DE6Enjg6U3MkU8-kqu5Q/clip_image002_thumb[4].gif)
进程B:
.gif]
![](https://nvhxyw.bay.livefilestore.com/y1mM-RamXym4oN99cmnz_sSD_yiNNkMvK1ulanNp-kjx2DGFk2b8qwrGmyjisEHrtG2_SxmIWgIBqRQHZkvzWcbsh5s37y9OB2Y7uEEj6MW1HqSmU3JjMhiq2O68gTE0ZVAfD-M52eg8NEF02ubee4lcg/clip_image004_thumb[2].gif)
相关文章推荐
- windows笔记-使用内存映射文件在进程之间共享数据
- windows笔记-使用内存映射文件在进程之间共享数据
- Win32汇编使用内存映射文件在进程间共享数据
- 使用内存映射文件在进程间共享数据
- 使用内存映射文件在进程之间共享数据
- 【VS开发】内存映射文件进程间共享内存
- Windows进程通信--使用内存映射文件
- 【C语言】【unix c】使用mmap将文件映射到进程的虚拟地址空间,然后对内存的操作直接反应到文件中
- 使用内存映射文件在进程间共享数据
- 使用内存映射文件在进程之间共享数据
- 使用内存映射文件在进程之间共享数据
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- 【VS开发】内存映射文件3
- VC++中使用内存映射文件处理大文件 (2)
- VC++中使用内存映射文件处理大文件
- 进程入门之使用文件映射
- delphi:内存映射对于大文件的使用--copy from bdmh
- VC++中使用内存映射文件处理大文件