2013-09-29 274 views
1
//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故障。當我打印出Seg_id時,看起來正常的只是一些數字。但Seg_ptr指向0xffffffffffffffff。然後下一行代碼顯然給我seg錯誤。我想知道爲什麼Seg_ptr指向內存空間的末尾。提前致謝!由地址空間末尾的shmat指針返回的指針,它給出了seg故障

+2

所以shmat返回'-1'。這意味着有錯誤。在這種情況下檢查errno以確定錯誤是什麼。 – Mat

+0

感謝您的提示,我得到了errno = 13,這是權限被拒絕。可能是什麼原因? 我在我的一個類的成員函數中運行這些代碼。會導致這種錯誤嗎? – Flmhdfj

+0

你可能想檢查一下你的Seg_id是否也是「好」的。如果這是'-1',那麼我希望你不會從'shmat'中得到一個好的錯誤。 –

回答

3

經過測試,看來非root用戶不能使用shmat,否則會返回Permission Denied。

最近更新: 設置權限幫助,如shmget(SHM_KEY,sizeof(...),(IPC_CREAT | 0666))。它變成共享內存段已經存在相同的密鑰。然後我可以使用ipcs來檢查我是否已經擁有共享內存段,並使用相同的密鑰並使用ipcrm來釋放它。