23.12.03 최초 작성
/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);
}