【问题标题】:Shared memory POSIX put value to string共享内存 POSIX 将值放入字符串
【发布时间】:2016-01-03 21:17:20
【问题描述】:

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

【问题讨论】:

    标签: c++ posix shared-memory


    【解决方案1】:

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

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

    【讨论】:

    • 哦,谢谢你,我是新手,我犯了这个愚蠢的错误:(
    • 这行得通吗?字符串不是基本对象。它有自己的分配,不会在共享内存中。最好坚持使用简单的整数(包括字符数组)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2011-04-01
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多