gpt4 book ai didi

c++ - 写入共享内存时出现段错误

转载 作者:行者123 更新时间:2023-11-27 22:48:53 34 4
gpt4 key购买 nike

我在 Netbeans 中创建了一个项目,它在那里运行良好。但是当我尝试使用 makefile 进行编译时,我收到了段错误。为什么我不能访问共享内存?我应该使用 char* 吗?

#include <fstream>
#include <string>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

static std::string *shmem; //shared memory

int main(int argc, char** argv)
{
//open file and copy content
std::ifstream ifs("example.txt");
std::string content( (std::istreambuf_iterator<char>(ifs) ),
(std::istreambuf_iterator<char>() ) );
size_t size = content.size();

//create shared memory page and copy content
shmem = static_cast<std::string*>(mmap(NULL, size, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0));
*shmem = content;

return 0;
}

这是我的生成文件

CC      = g++
CFLAGS = -c -Wall -std=c++11 -pthread
LDFLAGS = -pthread
SOURCES = main.cpp
OBJECTS =$(SOURCES:.cpp=.o)
EXECUTABLE=MapReduce

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
$(CC) $(CFLAGS) $< -o $@

最佳答案

您不能将 mmap 的返回类型转换为 std::string。 std::string 是 c++ 非 POD 类型。您需要调用 std::string 的构造函数,它可能会执行动态分配(但是,它可以使用小字符串优化)。这将导致字符串实际上并不存在于共享内存中,除了它的大小字段可能取决于它的实现方式。

如果你想在共享内存中存储一​​个字符串缓冲区,你应该只使用 char*,或者查看像 Boost.Interprocess 这样的库。 .该库是跨平台的,将使将各种类型放入共享内存变得更加简单,当然是以引入 Boost 为代价的。

关于c++ - 写入共享内存时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39813922/

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