类似于 mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);在 windows
analogy to mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); in windows
我正在尝试将一些 linux C++ 移植到 windows 并且卡在了这样的一行
void* ptr = mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
我发现这是一种动态分配内存的方法,因为文件描述符是 -1。
如何在 windows 中执行此操作?我在文档中找不到任何可以在没有文件处理程序的情况下使用 MapViewOfFile
的内容。
MapViewOfFile
不带文件句柄,带文件映射句柄。要分配内存块,您可以创建一个匿名文件映射,如下所示:
::DWORD const bytes_count_to_map{4u * 1024u * 1024u};
auto const h_mapping
{
::CreateFileMappingW
(
INVALID_HANDLE_VALUE // not binded to actual file
, nullptr // default security
, PAGE_READWRITE | SEC_COMMIT // access flags
, 0u // map high
, bytes_count_to_map // map low
, nullptr // no name
)
};
if(NULL == h_mapping)
{
auto const last_error{::GetLastError()};
// TODO deal with error...
exit(-1);
}
auto const p_view
{
::MapViewOfFile
(
h_mapping // mapping handle
, FILE_MAP_READ | FILE_MAP_WRITE // map flags
, 0 // offset high
, 0 // offset low
, bytes_count_to_map // size
)
};
if(nullptr == p_view)
{
auto const last_error{::GetLastError()};
// TODO deal with error...
exit(-2);
}
if(FALSE == ::UnmapViewOfFile(p_view))
{
auto const last_error{::GetLastError()};
// TODO deal with error...
exit(-3);
}
if(FALSE == ::CloseHandle(h_mapping))
{
auto const last_error{::GetLastError()};
// TODO deal with error...
exit(-4);
}
我正在尝试将一些 linux C++ 移植到 windows 并且卡在了这样的一行
void* ptr = mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
我发现这是一种动态分配内存的方法,因为文件描述符是 -1。
如何在 windows 中执行此操作?我在文档中找不到任何可以在没有文件处理程序的情况下使用 MapViewOfFile
的内容。
MapViewOfFile
不带文件句柄,带文件映射句柄。要分配内存块,您可以创建一个匿名文件映射,如下所示:
::DWORD const bytes_count_to_map{4u * 1024u * 1024u};
auto const h_mapping
{
::CreateFileMappingW
(
INVALID_HANDLE_VALUE // not binded to actual file
, nullptr // default security
, PAGE_READWRITE | SEC_COMMIT // access flags
, 0u // map high
, bytes_count_to_map // map low
, nullptr // no name
)
};
if(NULL == h_mapping)
{
auto const last_error{::GetLastError()};
// TODO deal with error...
exit(-1);
}
auto const p_view
{
::MapViewOfFile
(
h_mapping // mapping handle
, FILE_MAP_READ | FILE_MAP_WRITE // map flags
, 0 // offset high
, 0 // offset low
, bytes_count_to_map // size
)
};
if(nullptr == p_view)
{
auto const last_error{::GetLastError()};
// TODO deal with error...
exit(-2);
}
if(FALSE == ::UnmapViewOfFile(p_view))
{
auto const last_error{::GetLastError()};
// TODO deal with error...
exit(-3);
}
if(FALSE == ::CloseHandle(h_mapping))
{
auto const last_error{::GetLastError()};
// TODO deal with error...
exit(-4);
}