我目前正在linux上的2个进程之间的共享内存中尝试put结构。我没有共享bool或int的问题,但在尝试共享字符串时,std :: string或char我有一个分段错误错误。
现在我的代码是:
#include <iostream>
#include <sys/types.h> //shmat
#include <sys/shm.h>
#include <sys/stat.h> //open
#include <fcntl.h>
#include <unistd.h> //close
using namespace std;
struct Prises{
int numero;
int transactionId;
bool reservation;
bool charge;
bool disponibilite;
bool defaut;
bool verrouillage;
bool trappe;
int LEDverte;
int LEDrouge;
std::string carte;
std::string etat;
};
int main()
{
const char *keyFile = "/tmp/key.dat";
/* Make sure the file exists. */
int descriptor = open(keyFile, O_CREAT | O_RDWR, S_IRWXU);
/* Only wanted to make sure that the file exists. */
close(descriptor);
/* Generate memory key. */
key_t sharedKey = ftok(keyFile, 1);
/* Get the shared memory segment id. Note we include
the permissions. */
int sharedSpaceId = shmget(sharedKey, 2*sizeof(Prises),
IPC_CREAT | S_IRUSR | S_IWUSR);
/* Attach the shared memory segment. */
Prises *PrisesArray = (Prises *) shmat(sharedSpaceId, NULL, 0);
PrisesArray[1].defaut=true;
PrisesArray[2].defaut=false;
int ok;
std::cin>>ok;
return 0;
}
在这个例子中,从2个结构共享2个bool工作得很好但是如果我尝试输入数据或从std :: string(etat,carte)读取数据,如下所示:
PrisesArray[1].etat="hello";
它在调试中给了我一个分段错误(并且明确在发布时不起作用),我尝试使用简单的字符串和字符(甚至一个字符),它仍然给我一个分段错误。
在文字共享或在这里犯错时我错过了什么?
答案 0 :(得分:5)
它在调试中给了我一个分段错误(并明确表示不会在其中工作) 发布),我试过简单的字符串和char(甚至一个字符)和它 仍然给我一个分段错误。
这是因为std :: string不是POD(普通旧数据)类型。 std :: string在幕后执行动态内存分配(使用new),在序列化它时(例如共享内存或文件),只有指针被序列化。当反序列化(从共享内存或文件)内存到原始指针可能不再存在时,这会使反序列化的字符串无法使用。
您必须编写一个明确地将字符串序列化到共享内存的函数,就像标准运算符 std :: ostream operator&gt;&gt;(std :: ostream&amp; stream,const)的情况一样的std :: string&安培;)强>
答案 1 :(得分:0)
您必须共享与std :: string相关联的数据,即
//服务器部分:
struct ShmData{
`...`
char chAux[1024];
};
int main()
{
...
shared_memory_object shm (create_only, "MyMem", read_write);
shm.truncate(offset_t(sizeof(ShmData)) );
mapped_region region(shm, read_write);
ShmData *shmData = (ShmData*)(region.get_address());
...
std::string str( "some stuff over the server" );
...
strcpy( shmData->chAux, str.c_str() );
...
}
//on client, the same struct and:
int main()
{
shared_memory_object shm (open_only, "MyMem", read_write);
mapped_region region(shm, read_write);
ShmData *shmData = (ShmData*)(region.get_address());
std::string strLocal(shmData->chAux); //assign to a local string the shared data
std::cout << "show strLocal\n";
std::cout << strLocal << std::endl;
....
}