共享内存 POSIX 将值赋给字符串

Shared memory POSIX put value to string

我想在共享内存中创建字符串。我有简单的 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。我做错了什么?

您只需分配内存即可。这还不够。首先,您需要构造一个字符串对象。为此,您可以使用放置 new operator,如:

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

但是,如果您希望字符串的实际 内容 位于共享内存中,这将无法解决您的问题。一种处理方法是为 std::basic_string class 定义自定义分配器,该分配器将使用共享内存池。另一方面,也比较麻烦,这样创建的字符串对象与标准的 std::string.

类型不同。

因此最好只使用普通的旧 C zero-terminated 字符串:

#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;
}