세마포어 생성시...?
글쓴이: thisrule / 작성시간: 토, 2003/12/27 - 8:07오전
세마포어 생성시에 아래와 같은 방법으로 2개의 process를 생성하였는데,
int status = 0; if( ( g_semid = semget( ULSSEMKEY, 1, 0600 | IPC_CREAT | IPC_EXCL ) ) < 0 ) { if( errno == EEXIST ) g_semid = semget( ULSSEMKEY, 1, 0 ); } else { U_SEMUN arg; arg.val = 1; status = semctl( g_semid, 0, SETVAL, arg ); } if( g_semid < 0 || status < 0 ) { perror( "semaphore create error!" ); return -1; }
그런데 critical section에 2개의 process가 동시에 접근하더군요...!?
이리저리 삽질하다가, 아래 부분을if( ( g_semid = semget( ULSSEMKEY, 1, 0600 | IPC_CREAT | IPC_EXCL ) ) < 0 )
아래처럼if( ( g_semid = semget( ULSSEMKEY, 1, 0600 | IPC_CREAT ) ) < 0 )
하니깐 제대로 되더군요.
왜 그렇죠?
:oops: 질문 내용이 내가봐도 좀 이상한데...
Forums:
IPC_CREAT | IPC_EXCL 는 세마포어를 생성하되이미 존재
IPC_CREAT | IPC_EXCL 는 세마포어를 생성하되
이미 존재한다면 -1 을 리턴(실패) 하라는 뜻입니다.
단순히 IPC_CREAT 를 쓰신다면 세마포어가 이미 존재해도
상관없습니다.
이는 제가 아는한 세마포어뿐아니라 메시지큐나 공유메모리에서도
마찬가지인지 알고 있습니다.
세마포어가 이미 존재하는지를 확인해보세요
light my fire
댓글 달기