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;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.