물론 디바이스 드라이버를 이용해서 CPU의 내장 타이머들을 이용해서 직접적으로 제어를 해도 되지만... 대략 1초 이상의 초단위 타이머를 사용하고자 한다면 심플하게 signal 함수를 이용해서 초단위의 타이머를 구현할 수 있다.
 

signal 중에서 SIGALRM 이 있는데 이 signal은 alarm 함수가 보내는 signal 이다. 이 alarm을 주기적으로 발생하고 signal을 처리 하면 리눅스에서도 타이머를 사용할 수 있다.

리눅스 상에서 TImer는 언듯 잘 떠올려지지 않는다. 윈도우 시스템에서는

SetTimer를 사용하면 쉽게 타이머를 사용할 수 있지만 리눅스는 메세지 베이스가 아니기 때문에 쉽게 떠오르지 않는다.

하지만 리눅스 시스템에도 이벤트는 있다 바로 signal이다. signal을 주기적으로 받을 수 있다면 타이머 대신으로도 사용할 수 있다.

signal 중에서 SIGALRM 이 있는데 이 signal은 alarm 함수가 보내는 signal 이다. 이 alarm을 주기적으로 발생하고 signal을 처리 하면 리눅스에서도 타이머를 사용할 수 있다. ^^ 한가지 아쉬운 점은 최소 단위가 1초라는 점이다. 아래 코드를 실행하면 1초 간격으로 TImer Call 이라는 문장이 출력 된다.

아래 코드는 간결 하기 때문에 라인 바이 라인으로 설명하지는 않겠다.


#include <stdio.h>
#include <signal.h>
#include <unistd.h>

#define INTERVAL        1

void timer(int signo)
{
        printf("Timer Call\n");
        alarm(INTERVAL);
}

main()
{
        struct sigaction act;

        act.sa_handler = timer;
        sigemptyset(&act.sa_mask);
        act.sa_flags = 0;

        sigaction(SIGALRM, &act, 0);

        alarm(INTERVAL);

        while(1)
        {
                sleep(100);  
        }
}

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

시그널(Ctrl+C, Ctrl+Z, Ctrl+\ 등등)이 발생시 이를 처리하는 프로그램입니다~
시스템프로그래밍을 배울때 기초로 많이 작성하는 프로그램이죠 ㅋ
컨트롤+Z를 누르면 시그널이 메세지를 표시하고 반영되지 않도록 하는 프로그램이에요~
코드는 맨 아랫줄에 받을 수 있는 링크가 있어요 ㅋ

사용자 삽입 이미지


#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>

void catchsigint (int signo) {
 char handmsg[] = "I found SIGINT \n ";

 if(signo == 20)
  strcpy(handmsg, "I found SIGTSTP\n");
 else if(signo == 3)
  strcpy(handmsg, "I found SIGQUIT\n");

 int msglen = strlen(handmsg);
 write(STDERR_FILENO, handmsg, msglen);
}

int main(void)
{
 struct sigaction act;
 act.sa_handler = catchsigint;
 act.sa_flags = 0;

 if((sigemptyset(&act.sa_mask) == -1 ) || (sigaction(SIGQUIT, &act, NULL) == -1))
  perror("Failed to set SIGQUIT to handle Ctrl-Bslash ");
 else if((sigemptyset(&act.sa_mask) == -1) || (sigaction(CTRL_Z, &act, NULL) == -1))
  perror("Failed to set SIGTSTP to handle Ctrl-Z ");

  for(;;);
return 0;
}

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요