【发布时间】:2012-12-22 01:45:45
【问题描述】:
我正在尝试通过共享内存在父级和分叉子级之间共享已定义类的指针。
所以在父母的主要我创建了指针
mydata *p;
Reader::GetInstance()->Read(p, i+1);
pid = fork();
if (pid == -1){
cout << "error on fork"<<endl;
}else if (pid == 0){
cout << "i will fork now" <<endl;
const char * path = "./mydatamanager";
execl (path, "-", (char *)0);
break;
}else {
writer(shmid, p);
}
作者包含这个
void writer(int shmid , mydata * p)
{
void *shmaddr;
shmaddr = shmat(shmid, (void *)0, 0);
if((int)shmaddr == -1)
{
perror("Error in attach in writer");
exit(-1);
}
else
{
memcpy( shmaddr, p, sizeof(*p) );
}
}
我的数据是
class mydara {
public:
int var1;
int var2;
int var3;
int var4;
int var5;
int var6;
char *var7;
mydata (int v2, int v3,char *v7, int v6){
var2 = v2;
var3 = v3;
var7 =new char[128];
strcpy(var7, v7);
var6 = v6;
var4 = 0;
var5 = 0;
}
};
在 mydatamanager 中我以这种方式得到这个指针
void reader(int shmid, mydata *& p)
{
cout << "in reader" << endl;
void *shmaddr;
//sleep(3);
shmaddr = shmat(shmid, (void *)0, SHM_RDONLY|0644);
if((int)shmaddr == -1)
{
perror("Error in reader");
exit(-1);
}
else
{
cout << "in else "<< endl;
p = (mydata*) shmaddr;
cout <<"shared memory address is " <<shmaddr <<endl;
cout <<"var5 "<< p->var5<< endl;
cout <<"var2 "<< p->var2<< " match with "<<getpid() << "?" << endl;
cout <<"var3 "<< p->var3<< endl;
cout <<"var4 "<< p->var4<< endl;
cout <<"var7 "<< p->var7<< endl; // the
//shmdt(shmaddr);
}
}
和 mydatamanager main :
int main()
{
cout << "in main" <<endl;
int shmid;
shmid = shmget(IPC_PRIVATE, 4096, IPC_CREAT|0644);
cout << "in advanced point" <<endl;
sleep(1);
mydata * p;
reader (shmid, p);
cout << p->var7 <<endl;
return 0;
}
结果始终为 0。 我如何通过父母和孩子分享这个指针,我的代码哪里出了问题?
【问题讨论】:
-
reader的转换中使用的类型mydata的定义是什么?它是 C 结构吗? -
危险会出现在罗宾逊身上!!!!!如果您要使用共享内存,我会鼓励您使用 POD(“普通旧数据”)结构,而不是类。而且您不得在一个进程中“new[]”一个数组,并期望它在另一个进程中有效!!!
-
我没有看到你调用 shmget() 来创建共享内存。您的作者应该执行 memcpy( shmaddr, p, sizeof(*p) ) 之类的操作来将数据复制到共享内存。您的读者可以执行“p = (mydata *) shmaddr;”。共享内存 (var7) 中的指针是个问题。
-
@didierc 它与 writer 中的类相同
-
@brian beuning var7 应该是什么问题?
标签: c++ linux pointers ipc shared-memory