semaphore 제어가 잘 안되요

khs0106의 이미지

세마포어 1개만 만들고 두 프로세스에서 세마포어를 사용하고자 합니다.
두 프로세스가 각각 세마포어 사용하고 반환하도록 했습니다.
처음에는 제어가 잘 되다가 계속 돌리면 어느 순간 두 프로세스 모두 세마포어를 얻습니다.;;
몇일동안 찾아보고 책봐도 잘 모르겠습니다;; 도와주세요~~

커널: 2.4.18
---------------------------------------------------------------------------------

SemID = semget((key_t)SEMAPHORE_KEY, 1, IPC_CREAT);

로 세마포어 1개 만들고

union semun sem_union;
sem_union.val = 1;
if(semctl(SemID, 0, SETVAL, sem_union ) < 0){
	return false;
}
return true;

로 이니셜하고

사용할 땐

struct sembuf SemCtrl;
SemCtrl.sem_num = 0;
SemCtrl.sem_op = -1;
SemCtrl.sem_flg = SEM_UNDO;
 
if(semop(SemID, &SemCtrl, 1) < 0){	//fail
	return false;
}
else{
	return true;
}

사용이 끝나면

struct sembuf SemCtrl;
SemCtrl.sem_num = 0;
SemCtrl.sem_op = 1;
SemCtrl.sem_flg = SEM_UNDO;
 
if(semop(SemID, &SemCtrl, 1) < 0){	//fail
	return false;
}
else{
	return true;
}

이와 같이 사용하고 있습니다.

============================================================================
세마포어 관련 제가 만든 코드입니다.

 
union semun {
	int val;			
	struct semid_ds *buf;		
	unsigned short *array;		
};
 
 
int SemID;	//semaphore ID
 
 
/**********************************************************************************************//**
 *
 * @brief    세마포어 생성
 * @author  
 * @retval   성공 / 실패 
 * @date
 * @li 
 * @remarks
 *
 *************************************************************************************************/
 
int Make_Semaphore(void)
{
	SemID = semget((key_t)SEMAPHORE_KEY, 0, IPC_EXCL);
 
	if(SemID < 0){	//semaphore 없음 
		DebugPrintf(1," Create Semaphore \n");
		SemID = semget((key_t)SEMAPHORE_KEY, 1, IPC_CREAT);
		if(SemID < 0){
			DebugPrintf(1,"[Make_Semaphore] ERR: %s \n", strerror(errno));
			WriteErrorLog("[Make_Semaphore] Err: %s",strerror(errno));			
			return false;
		}
		else{
			DebugPrintf(1," Semaphore ID: %x \n", SemID);
			return true;
		}
	}
	else{			//semaphore 존재?
		DebugPrintf(1," Semaphore ID: %x \n", SemID);
		return true;
	}
}
 
/**********************************************************************************************//**
 *
 * @brief	 세마포어 초기화 
 * @author	
 * @retval	 성공/실패 
 * @date
 * @li 
 * @remarks
 *
 *************************************************************************************************/
int Initial_Semaphore(void)
{
	union semun sem_union;
 
	sem_union.val = 1;
 
	if(semctl(SemID, 0, SETVAL, sem_union ) < 0){
		DebugPrintf(1,"[Initial_Semaphore] ERR: %s \n", strerror(errno));
		WriteErrorLog("[Initial_Semaphore] Err: %s",strerror(errno));
 
		return false;
	}
	return true;
 
} 
/**********************************************************************************************//**
 *
 * @brief	 세마포어 사용 요청 
 * @author	
 * @retval	 성공/실패 
 * @date
 * @li 
 * @remarks
 *
 *************************************************************************************************/
int Request_Semaphore(void)
{
	struct sembuf SemCtrl;
 
	SHARED_MEMORY *shared_memory;
 
	shared_memory = get_CDMA_block();
	if(shared_memory == NULL){
		WriteErrorLog("get_CDMA_block() fail");
	}
 
	while(shared_memory->semaphore_status != RETURN_SEMAPHORE);
 
	SemCtrl.sem_num = 0;
	SemCtrl.sem_op = -1;
	SemCtrl.sem_flg = SEM_UNDO;
 
 
	if(semop(SemID, &SemCtrl, 1) < 0){	//fail
		DebugPrintf(1," [Request_Semaphore] Err: %s\n",strerror(errno));
		WriteErrorLog("[Request_Semaphore] Err: %s",strerror(errno));
		return false;
	}
	else{
		DebugPrintf(1," [Request_Semaphore] success\n");
		shared_memory->semaphore_status = REQUEST_SEMAPHORE;
		return true;
	}
	return false;
}
/**********************************************************************************************//**
 *
 * @brief	 세마포어 사용 반환 
 * @author	
 * @retval	 성공/실패 
 * @date
 * @li 
 * @remarks
 *
 *************************************************************************************************/
int Return_Semaphore(void)
{
	struct sembuf SemCtrl;
 
	SHARED_MEMORY *shared_memory;
 
	shared_memory = get_CDMA_block();
	if(shared_memory == NULL){
		WriteErrorLog("get_CDMA_block() fail");
	}
 
	SemCtrl.sem_num = 0;
	SemCtrl.sem_op =  1;
	SemCtrl.sem_flg = SEM_UNDO;
 
	if(semop(SemID, &SemCtrl, 1) < 0){	//fail
		DebugPrintf(1," [Return_Semaphore] Err: %s\n",strerror(errno));
		WriteErrorLog("[Return_Semaphore] Err: %s",strerror(errno));
		return false;
	}
	else{
		DebugPrintf(1," [Return_Semaphore] Success\n");
		shared_memory->semaphore_status = RETURN_SEMAPHORE;
		return true;
	}
 
	return false;
}