timer 추가

EEEFFEE·2023년 11월 26일
0

kdt system-project note

목록 보기
3/15

23.11.26 최초 작성

/system/system_server.c

  • 일정 시간 간격으로 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;

0개의 댓글

관련 채용 정보