23.11.26 최초 작성
일정 시간 간격으로 SIGALRM signal
을 발생시키고 메시지를 출력하도록 함
void timer_sighandler()
: SIGALRM
발생 시 실행될 함수로 메시지를 출력함
int posix_sleep_ms()
: timespec
의 멤버 값 2개를 받아 해당 시간만큼 sleep()
하는 함수
int system_server()
: 타이머를 세팅 함
struct itimerspec it
: 시간 간격 정보를 저장struct sigaction sa
: 시그널 발생 시 수행 될 함수의 주소 저장struct sigevent sev
: 타이머 만료 시 시그널 전달받을 방법 지정timer_t tidlist
: 생성 될 타이머의 정보 저장#include <stdio.h>
#include <sys/prctl.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>
#include <system_server.h>
#include <gui.h>
#include <input.h>
#include <web_server.h>
void timer_sighandler(){
static int timer = 0;
timer ++;
printf("System timer : %d sec\n", timer );
}
int posix_sleep_ms(unsigned int overp_time, unsigned int underp_time)
{
struct timespec sleep_time;
sleep_time.tv_sec = overp_time;
sleep_time.tv_nsec = underp_time;
return nanosleep(&sleep_time, NULL);
}
/* 타이머 세팅 시작 */
int system_server()
{
printf("Enter system_server process\n");
struct itimerspec it;
struct sigaction sa;
struct sigevent sev;
timer_t tidlist;
printf("나 system_server 프로세스!\n");
/* SIGALRM 시그널에 timer_sighandler 호출되도록 설정 */
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;;
sa.sa_handler = timer_sighandler;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGALRM, &sa, NULL) < 0)
perror("Sigaction error");
it.it_value.tv_sec = 5;
it.it_value.tv_nsec = 0;
it.it_interval.tv_sec = 5;
it.it_interval.tv_nsec = 0;
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGALRM;
sev.sigev_value.sival_ptr = &tidlist;
if (timer_create(CLOCK_REALTIME, &sev, &tidlist) < 0) {
perror("timer_create");
exit(-1);
}
if (timer_settime(tidlist, 0, &it, NULL) < 0) {
perror("timer_settime");
exit(-1);
}
/* 타이머 세팅 끝*/
while (1) {
posix_sleep_ms(5, 0);
}
return 0;