2013-09-29 2 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 바이트 char 배열과 일부 구문 분석 함수로 정의한 클래스입니다. Shmget과 Shmat을 다른 사람들이 사용하는 것처럼 사용하고 있다고 생각합니다. 그러나 나는 계속 seg fault를 얻는다. Seg_id를 인쇄하면 보통 숫자로 보입니다. 그러나 Seg_ptr은 0xffffffffffffffff를 가리 킵니다. 그러면 다음 코드 행은 분명히 나에게 오류를 준다. Seg_ptr이 메모리 공간의 끝을 가리키는 이유를 알고 싶습니다. 미리 감사드립니다!포인터가 주소 공간 끝에있는 shmat 점에 의해 반환 됨 seg 오류가있는

+2

따라서 shmat은'-1'을 반환합니다. 오류가 있음을 의미합니다. 이 경우 errno를 검사하여 오류의 원인을 판별하십시오. – Mat

+0

팁 주셔서 감사합니다, 나는 권한이 거부되었습니다 errno = 13 있어요. 원인이 무엇일까요? 클래스의 멤버 함수에서이 코드를 실행하고 있습니다. 이런 종류의 오류가 발생합니까? – Flmhdfj

+0

'Seg_id'가 "good"인지 확인하고 싶을 수도 있습니다. 이것이'-1'이라면,'shmat'에서 좋은 에러를 얻지 못할 것으로 기대합니다. –

답변

3

테스트를 마친 후 root가 아닌 사용자가 shmat을 사용할 수 없거나 Permission Denied가 반환됩니다.

늦게 업데이트 : shmget (SHM_KEY, sizeof (...), (IPC_CREAT | 0666))과 같이 설정 권한이 도움이됩니다. 동일한 키가 이미있는 공유 메모리 세그먼트가 나타났습니다. 그런 다음 ipcs를 사용하여 동일한 키가있는 공유 메모리 세그먼트가 이미 있는지 확인하고 ipcrm을 사용하여이를 해제 할 수 있습니다.