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;

}