地址空间末尾的shmat点返回的指针给出了seg错误

时间:2013-09-29 07:33:44

标签: c++ linux new-operator shared-memory memory-alignment

 //TeamSize is an integer   
int Seg_id = shmget(SHM_KEY,sizeof(Word)*TeamSize,IPC_CREAT);

void* Seg_ptr = shmat(Seg_id,0,0);

new(Seg_ptr) Word[TeamSize];

我遇到了这段代码的问题。 Word类是我用8字节char数组和一些解析函数定义的类。我想我正在使用shmget和shmat,就像其他人使用它们一样。但我不断遇到段故障。当我打印出Seg_id时,看起来正常只是一些数字。但Seg_ptr指向0xffffffffffffffff。然后下一行代码显然给了我seg错误。我想知道为什么Seg_ptr指向内存空间的末尾。提前谢谢!

1 个答案:

答案 0 :(得分:3)

经过测试,似乎非root用户无法使用shmat,否则将返回Permission Denied。

延迟更新:   设置权限有帮助,例如shmget(SHM_KEY,sizeof(...),(IPC_CREAT | 0666))。但是我一直得到无效的参数;事实证明共享内存段已经存在相同的密钥。然后我可以使用ipcs来检查我是否已经拥有相同密钥的共享内存段并使用ipcrm来释放它。