共享内存 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;
}
我想在共享内存中创建字符串。我有简单的 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;
}