세마포어 생성시...?

thisrule의 이미지

세마포어 생성시에 아래와 같은 방법으로 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: 질문 내용이 내가봐도 좀 이상한데...

morison77의 이미지

IPC_CREAT | IPC_EXCL 는 세마포어를 생성하되
이미 존재한다면 -1 을 리턴(실패) 하라는 뜻입니다.
단순히 IPC_CREAT 를 쓰신다면 세마포어가 이미 존재해도
상관없습니다.
이는 제가 아는한 세마포어뿐아니라 메시지큐나 공유메모리에서도
마찬가지인지 알고 있습니다.
세마포어가 이미 존재하는지를 확인해보세요

light my fire