请教下OpenFileMapping和CreateFileMapping内存共享问题?
本帖最后由 VisualEleven 于 2012-12-06 10:22:30 编辑 需求:进程创建一个共享内存,内存可读写,进程异常关闭(如任务管理器直接结束进程),进程重启,可读到前次读写的数据。
现在只完成了内存数据的读写,进程一重启,数据就没了,又要重新创建共享内存?
部分代码:
m_hShareMemory = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,pName);
if (m_hShareMemory == NULL)
{
CreateFile();
CreateFileMapping();
MapViewOfFile();
}
else
{
MapViewOfFile();
}
每次重启进程,OpenFileMapping返回的是NULL。大神帮忙解答下,谢谢
[最优解释]
如果只有一个进程,内存映射跟直接读文件是一样的,
区别在于你自己去用读文件(readfile)函数去读
还是交给内存映射函数(createfilemapping)去读。
但是从逻辑角度讲,既然不需要共享还是自己读文件合理些。
如果好几个进程都需要的话,那必须另起进程创建一个共有内存了。
[其他解释]
其它进程有打开这个内核对象吗?
[其他解释]
这种情况应该是进程重启后映射文件已被关闭,你可以试着在进程外建立映射文件(比如进程通过发送消息来在主线程里建立映射文件),这样进程重启后映射文件就不会被关闭,而你的进程重启后也能打开已建立的映射文件并读以前的数据
[其他解释]
除非其他进程访问了你的共享内存,否则共享内存一旦没人访问则关闭了。
[其他解释]
其实你用一个程序建立映射文件,然后再用另一个文件打开映射文件也是可以的,我试过,而且一个进程修改了数据,其它进程也实时改变
[其他解释]
其他进程没有打开,我是想用这个共享内存共享一些数据,以防进程异常退出,重新启动的时候重要数据丢失
[其他解释]
我完全可以单独用一个进程来创建一个共享内存,别的进程进行读写,但是问题是,没有进程是绝对安全的吧。。我希望这个内存一直 存在着除非电脑重启。。。
[其他解释]
共享内存一定要一直有一个进程访问的吗,如果没有就会自动回收?
[其他解释]
共享内存顾名思义,大家共享才用得着有内存。
你自己程序用,干嘛费劲创建共有内存,申请一个块内存不一样用。
你说的这种需要,必须另起进程创建并管理共有内存。
如果需要保存数据,可以创建共有内存的时候映射的磁盘文件,可以随时把数据保存下来
[其他解释]
不访问不会自动回收。
是你程序关闭后,导致不存在使用共向内存的句柄,被系统自动回收。
[其他解释]
嗯,我创建的那个共享内存就是映射到物理磁盘文件上的,但是重启读的话是读不到共享内存了,直接读文件这个没试,想想怎么样比较简单点,是直接用1个进程单独管理内存共享还是存文件
[其他解释]
这些数据是实时修改的,也就是经常修改的,写文件好还是共享内存好
------其他解决方案--------------------
嗯,我知道,我现在的问题是只一个进程在使用。。。作用是异常重启后还能得到前面的一些重要数据
[其他解释]
你不会是主进程重启吧,如果说主进程重启那子进程也会中止运行,你可以在主进程建立映射文件(用共享方式建立),然后了进程打开映射文件,再关闭子进程,这时映射文件不会消失,数据也不会丢失