共享内存POSIX将值放到字符串中

时间:2016-01-03 21:17:21

标签: c++ posix shared-memory

我想在共享内存中创建字符串。我有简单的程序i C ++:

#include<iostream>
#include<string>
#include<stdlib.h>
#include<semaphore.h>
#include<stdio.h>
#include<sys/shm.h>

int main(void){
    std::string* line;
    key_t lineKey = ftok("/tmp", '1');
    int sharedLine = shmget(lineKey, sizeof(std::string), IPC_CREAT | 0660);
    line = (std::string*)shmat(sharedLine, NULL, 0);

    std::string helpVar = "";
    while (true) {
        std::cin >> helpVar;
        (*line) = helpVar;
    }

    return 0;
}

但是当我执行它时(在执行g++ -o myprogram myprogram.cpp -lpthread时编译好)并写一些内容Core dumped。我错了什么?

1 个答案:

答案 0 :(得分:2)

你只需分配内存。这还不够。首先,您需要构造一个字符串对象。您可以将展示位置new operator用于此目的,如:

line = new(shmat(sharedLine, NULL, 0)) std::string();

但是,如果您希望字符串的实际内容位于共享内存中,则无法解决您的问题。处理这种情况的一种方法是为将使用共享内存池的std::basic_string类定义自定义分配器。另一方面,这将是一个太麻烦,并且与标准std::string相比,以这种方式创建的字符串对象将具有不同的类型。

因此,最好只使用普通的旧C终止字符串:

#define MAX_SIZE 100

int main(void){
    key_t lineKey = ftok("/tmp", '2');
    int sharedLine = shmget(lineKey, MAX_SIZE, IPC_CREAT | 0660);
    char *line = (char *)shmat(sharedLine, NULL, 0);

    std::string helpVar;
    while (true) {
       std::cin >> helpVar;
       strncpy(line, helpVar.c_str(), MAX_SIZE - 1);
    }

    return 0;
}