semaphore timer 추가

EEEFFEE·2023년 12월 2일
0

kdt system-project note

목록 보기
9/15

23.12.03 최초 작성

  • 1초에 한번씩 SIGALRM을 생성하는 타이머를 설정하고 이에 따라 시간 경과를 출력하는 기능 추가

  • /system/system_server.c :

#include <semaphore.h>

...

pthread_mutex_t toy_timer_mutex = PTHREAD_MUTEX_INITIALIZER;
static sem_t global_timer_sem;
static bool global_timer_stopped;

static void *timer_thread(void *not_used);

void set_periodic_timer(long sec_delay, long usec_delay);

...

int system_server(){
	
    ...
    
    //	timer_thread 생성
    pthread_t timer_thread_tid;
    
    retcode = pthread_create(&timer_thread_tid, NULL, timer_thread, NULL);
    if(retcode < 0){
        perror("Timer thread create error");
        exit(1);
    }
    
    ...
    
    while (system_loop_exit == false) {
        pthread_cond_wait(&system_loop_cond, &system_loop_mutex);
    }
    
    ...
	   
}

// 뮤텍스를 잠그고 toy_timer값을 증가시킨 후 뮤텍스 해제
void timer_sighandler(){
    pthread_mutex_lock(&toy_timer_mutex);
    toy_timer++;
    printf("toy_timer: %d\n", toy_timer);
    pthread_mutex_unlock(&toy_timer_mutex);
}   

// 무기명 세마포어 생성하고 while 루프 안에서 세마포어 취득 시 timer_sighandler 실행
static void *timer_thread(void *not_used)
{
    signal(SIGALRM, timer_sighandler);
    set_periodic_timer(1, 1);

    sem_init(&global_timer_sem, 0, 0);

    while (!global_timer_stopped) {
        sem_wait(&global_timer_sem);
        timer_sighandler();
    }
	return 0;
}

// SIGALRM 시그널에 맞춰 실행 될 함수
static void timer_expire_signal_handler(){
    sem_post(&global_timer_sem);
}

// SIGALRM이 발생할 시간 간격 지정
void set_periodic_timer(long sec_delay, long usec_delay)
{
	struct itimerval itimer_val = {
		 .it_interval = { .tv_sec = sec_delay, .tv_usec = usec_delay },
		 .it_value = { .tv_sec = sec_delay, .tv_usec = usec_delay }
    };

	setitimer(ITIMER_REAL, &itimer_val, (struct itimerval*)0);
}



0개의 댓글

관련 채용 정보