2015-01-26 3 views
1
내가 맥 OS X에서 세마포어 생성 할

:맥 OS X - sem_open retuns 0 errno를, 정의되지 않은 오류

const char *semaphore_open_path = "/tmp/sem_handle_open"; 
errno = 0; 
sem_t *semaphore_handle_open = sem_open(semaphore_open_path, O_CREAT, S_IRUSR | S_IWUSR, 0); 
if(semaphore_handle_open == SEM_FAILED || !semaphore_handle_open) 
{ 
    printf("ERROR sem_open init: %s , %d\n", strerror(errno), errno); 
    exit(EXIT_FAILURE); 
} 

내가 오류를 얻을 : 내가 잘못을 ERROR sem_open init: Undefined error: 0 , 0

를하고있는 중이 야 무엇을? 감사합니다. .

+0

sem_open을 호출하기 전에 errno = 0을 설정 했으므로 그 이유 때문에 정의되지 않은 오류가 발생합니다 : 0,하지만 호출이 성공하면 if 문에 입력되는 이유는 무엇입니까? – user7685985

+0

나는 이것을 다음과 같이 풀어 봤다. http://stackoverflow.com/questions/28167419/mac-os-x-sem-open-fail – user7685985

답변

2

sem_open에는 경로가 아닌 이름이 필요합니다. 또한 errnoextern int errno으로 선언해야하며, 그렇지 않으면 항상 0입니다.

이 스 니펫은 Mac에서 잘 작동합니다.

#include <semaphore.h> 
#include <stdio.h> 
#include <string.h> 

extern int errno; 

int main(void) { 

    sem_t *sem = sem_open("semaphore", O_CREAT, S_IRUSR | S_IWUSR, 0); 
    if (!sem) { 
    fprintf(stderr, "%s (%d)", strerror(errno), errno); 
    } 
    return 0; 

} 
+0

경로를 단순한 이름으로 바꿨지 만 여전히 같은 오류가 발생한다. – user7685985

+0

extern int errno를 선언하는 중입니다. 나는 잘 모르겠다. "나는 그 리눅스를 알고 있고 내 질문은 맥 OS에 관한 것이다."라고 말하면서 : "전통적인 C에서는 대신에 수동으로 errno (예 : extern int errno)를 선언하는 것이 일반적이었습니다. 이렇게하지 마십시오 최신 버전의 C 라이브러리에서는 작동하지 않지만, (오래된) UNIX 시스템에서는 이없고 선언이 필요합니다. " http://man7.org/linux/man-pages/man3/errno.3.html – user7685985