2012-03-03 6 views
0

값을 변경하려고 시도한 세마포가 있는데 실패합니다. man 페이지를 읽은 후에 값이 0보다 작 으면 SETVAL을 사용하면 실패 할 것이라고 배웠습니다 (초기화하지 못했습니다). 하지만 초기화 할 때 perror()을 호출하면 "식별자가 제거되었습니다."라는 메시지가 나타납니다. SETALL 또는 공용체를 가리키는 지 확실하지 않습니다.세마포어 초기화

내 초기화는 다음과 같습니다 : 내 노동 조합이 단지 수행 매뉴얼 페이지와 여러 다른 웹 사이트처럼 선언 한

union semun argument; 
unsigned short values[1]; 
values[0] = 1; 
argument.array = values; 
int retVal; 

//INITIALIZE our semaphore 
if(retVal = semctl(semId, 0, SETALL, argument) == -1) 
{ 
    perror("semaphore INITIALIZATION failed\n"); 
    exit(1); 
} 

그리고 나는 내가 있음을 알 수 있도록 세마포어를 반환 확인 semget() 후 확인을 부품이 올바르게 작동하고 있습니다. 누군가 내가 잘못 가고 있다고 말할 수 있다면 크게 감사 할 것입니다.

누구든지 내 오류 뒤에있는 이유를 설명하면 내 실수에서 가장 도움이 될 것이라고 배울 수 있습니다.

감사

업데이트 : 분명히 그것은 == -1 그래서 난 < 0로 변경하고 당신이 semId 이전에 초기화에 놓친 것은 아마도

+2

당신은/시스템 V 세마포어를 필요로 할 이유가 있습니까? POSIX 세마포어는 일반적으로 훨씬 더 좋으며 (saner API와 사용자 공간에서 구현 될 수 있기 때문에 훨씬 빠릅니다.) 아주 강력하지는 않으며 오래된 시스템에서는 사용할 수 없을 수도 있습니다. –

+0

'semid'를 언제 어떻게 설정 했습니까? – alk

답변

2

하지만 나는 모든 응답에 대한 감사를 몰라 정말 이상한 좋은 일을 좋아하지 않았다 semctl()으로 전화하십시오.

는 folliwing를 추가하려고 :

int semId = -1; 

... 

semId = semget(IPC_PRIVATE, 1, IPC_CREAT); 
if (-1 == semId) 
    perror("semget() failed"); 
else { 
/* Your call to semctl() */ 
}