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:
댓글 달기