'리눅스프로그래밍'에 해당되는 글 2건

  1. 2007.11.15 리눅스에서의 타이머 - signal로 이용하기
  2. 2007.11.15 시그널 처리 프로그램 SIGINT, SIGQUIT, SIGTSTP
물론 디바이스 드라이버를 이용해서 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

댓글을 달아 주세요