ACE_Mem_Map
来源:互联网 发布:illustrator 2017 mac 编辑:程序博客网 时间:2024/06/06 15:04
ACE_Mem_Map类用来映射磁盘文件到内存。如果对映射的文件内存进行了修改,需要使用该类的sync函数将修改的数据同步到磁盘,但前提是调用map函数的时候传进去的参数share参数为ACE_MAP_SHARED才可,否则更新到磁盘不成功。
ACE_Mem_Map::map有三个重载函数,其中一个如下:
/// Map a file specified by @a filename.
int map (const ACE_TCHAR *filename,
size_t length = static_cast<size_t> (-1),
int flags = O_RDWR | O_CREAT, // 清空用 O_TRUNC
mode_t mode = ACE_DEFAULT_FILE_PERMS,
int prot = PROT_RDWR,
int share = ACE_MAP_PRIVATE, //需要更新到磁盘ACE_MAP_SHARED
void *addr = 0,
ACE_OFF_T offset = 0,
LPSECURITY_ATTRIBUTES sa = 0);
int sync (void *addr, size_t len, int flags=MS_SYNC)
如果len大于映射的大小,当文件不为空时则默认更新文件大小(Linux上测试),如果文件为空则会导致Segmentation fault。
测试代码如下:
#include "ace/Mem_Map.h"
#include "ace/ACE.h"
#include "ace/OS_NS_string.h"
#include "ace/OS_NS_unistd.h"
#include "ace/OS_NS_fcntl.h"
#include "ace/OS_Memory.h"
#include "ace/Log_Msg.h"
int main()
{
ACE_TCHAR test_file[MAXPATHLEN + 1];
if (ACE::get_temp_dir(test_file, MAXPATHLEN-18) == -1)
{
ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("Temp dir is too long\n")), -1);
}
ACE_OS::strcat(test_file, ACE_TEXT("ace_mem_map_temp_1"));
ACE_HANDLE file_handle = ACE_OS::open( test_file,
O_RDWR|O_CREAT|O_TRUNC,
ACE_DEFAULT_FILE_PERMS);
if (file_handle == ACE_INVALID_HANDLE)
{
ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("Open failed for %s\n"), test_file), -1);
}
if (ACE_OS::write(file_handle, "1234567890", 10) == -1)
{
ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("Write failed for %s\n"), test_file), -1);
}
ACE_OS::close (file_handle);
ACE_Mem_Map map(test_file);
if ( map.map(static_cast< size_t >(-1), PROT_RDWR, ACE_MAP_SHARED) == -1 )
{
ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("map failed for %s\n"), test_file), -1);
}
ACE_DEBUG((LM_DEBUG, ACE_TEXT("File Size %d\n"), map.size()));
ACE_OS::memset(map.addr(), 'A', map.size());
if ( map.sync(map.size()) == -1 )
{
ACE_DEBUG((LM_ERROR, ACE_TEXT("Sync failed for %s\n"), test_file));
}
map.unmap();
return 0;
}
- ACE_Mem_Map
- ACE_Mem_Map 笔记1
- ACE 中 ACE_Mem_Map 类的简单简单测试
- openapi升级,支持oauth1.0
- ListView使用SimpleAdapter加载非drawable资源图片
- telnet@Firebird
- 一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发
- EXcel+公式+小结
- ACE_Mem_Map
- [你必须知道的.NET]第十三回:从Hello, world开始认识IL
- diff与patch使用
- 网页关闭输入法,注册只能英文数字的解决办法
- linux 删除文件到回收站
- Android Bitmap 与 Drawable之间的转换
- 硬盘3TB的问题
- OpenGL ES教程V之更多3D模型(原文对照)
- Jboss配置远程调试