semaphore 제어가 잘 안되요
글쓴이: khs0106 / 작성시간: 수, 2010/12/22 - 2:30오후
세마포어 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;
}Forums:


댓글 달기