gpt4 book ai didi

c++ - mmap共享内存中的字符串c++

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:23 39 4
gpt4 key购买 nike

我的程序有段错误。

我正在尝试从 fork 访问字符串,但我什至无法将数据放入共享内存。

我的代码:

static string * currentSessionIP;

int main(int argc, char *argv[])
{
currentSessionIP = static_cast<string*>(mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
*currentSessionIP = "";
}

mmap 时没有错误,但是当我试图分配一些东西时,它是段错误。

如何从任何 fork() 访问字符串,甚至更改它?
提前致谢!

最佳答案

您没有构建 std::string,即调用它的构造函数。构造函数负责初始化对象数据。想象一下 string 是这样实现的:

struct string {
char* data;
size_t length;
// ...
};

你把这个结构和你的 Actor 一起放在有效的内存中,没问题,但是字段 datalength 的值没有被初始化,所以 data 指向一个随机地址并且 length 是垃圾,因此当您使用该字符串时会发生崩溃。在使用它之前,您必须显式调用构造函数,例如 currentSessionIP->string();,但这在 C++ 中是不可能的。相反,您必须使用 placement new语法,它结合了强制转换和对构造函数的调用,如下所示:

void * mem = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));

currentSessionIP = new (mem) string;

此语法更短且更安全,因为您确定调用了构造函数。但是你还没有完成,因为 string 结构将在共享内存中,但这只是“ header ”:data 没有理由指向你的共享内存内存块。

默认情况下,std::string 使用 std::allocator,它在您的程序堆上使用标准内存分配。解决方案是使用自定义分配器(std::basic_string 的模板参数)以确保 data 始终指向共享内存。您的分配器将由字符串对象调用在初始化和调整字符串大小时。

看看at this tutorial或在 boost interprocess ,同时下面是一个非常粗糙和不完整的实现,只是为了提出一个想法:

// a very simple shared memory allocator
struct shared_alloc {
typedef char value_type;
typedef char* pointer;
//... see http://en.cppreference.com/w/cpp/memory/allocator

pointer cur; // points to a free memory location
shared_alloc() {
cur = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
// todo: lifecycle (free memory block sometime)
}
pointer allocate(size_t n) {
pointer p = cur;
cur += n; // todo bound checking
return p;
}
void deallocate(pointer p, size_t n) {
// todo: do something smart
}
};

// an allocator object
shared_alloc alloc;

// a string with a custom allocator
typedef std::basic_string<char, std::char_traits<char>, shared_alloc> shared_string;

// allocate shared mem for the string object (the header)
void * header_mem = alloc.allocate(sizeof(shared_string));

// create a string object at this location, and use our allocator for the data
shared_string * currentSessionIP =
new( header_mem ) shared_string(alloc);

关于c++ - mmap共享内存中的字符串c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22530641/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com