由 shmat 返回的指针位于地址空间的末尾,这给出了 SEG 错误

pointer returned by shmat points at the end of address space which gives seg fault

本文关键字:错误 SEG 返回 shmat 指针 地址空间      更新时间:2023-10-16
 //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 字节字符数组和一些解析函数定义的类。我想我正在使用shmget和shmat,就像其他人使用它们一样。但我不断得到赛格的错。当我打印出Seg_id时,它看起来很正常,只是一些数字。但Seg_ptr指向0xffffffffffffffff。然后下一行代码显然给了我 seg 错误。我想知道为什么Seg_ptr在内存空间的末尾指向。提前感谢!

测试后,似乎非 root 用户无法使用 shmat,否则它将返回权限被拒绝。

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