从共享内存中读取字符串 C++ POSIX

Read string from shared memory C++ POSIX

在我的另一个问题中,一位用户帮助我通过共享内存发送字符串。但是当我尝试接收此数据时,程序显示 Core dumped。我试试这个代码:

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

sem_t *reader1_sem;
reader1_sem = sem_open("reader1_sem", O_CREAT, 0666, 0);

while (1) {
    sem_wait(reader1_sem);
    std::cout << (*line);
}

我也尝试将其重写为 char *,但它也不起作用 (char *line = (char *)shmat(...);)。

您不能将 std::string 放在共享内存上;存储在该对象内部的指针在 运行 进程之外没有意义。

C++ 委员会在某个时候设想您应该能够使用 shared-memory 分配器,该分配器将使用相对指针(例如可能 see here):

std::basic_string<char, std::char_traits<char>, magic_allocator<char>>

但是,这受到标准库实现的未指定性质的阻碍;该标准实际上并未强制要求使用分配器的标准库 类 在内部也使用分配器指针。 (我认为这是LWG 1521。)