액츄에이터 제어 실습시 보통 실험을 종료할 경우 ctrl-c 를 눌러 종료하게 되는데, 이 때 GPIO 신호는 그대로 실습때의 상태를 유지하게 된다. 즉, 전원이 켠 상태나 전등이 ON 상태로 프로그램을 종료해도 전원이 공급되고, 전등은 ON 상태로 남아있게 되는데 이렇게 종료되는 것을 방지하는 방법을 설명한다. 컴퓨터 시스템 상에서 발생할수 있는 상황도 여러가지가 있다. 이는 OS에 따라 다르게 설정된다. OS에서 어떠한 시그널을 지원하는 지는 kill 명령을 이용해서 알아볼수 있다. 아래는 라즈베리 파이에서 지원하는 시그널을 캡쳐한 화면이다.
리눅스 시스널 목록을 확인하는 명령어는 Kill -l 명령어다.
pi@raspberrypi:~ $
pi@raspberrypi:~ $ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
pi@raspberrypi:~ $
보통 32번까지의 시그널은 대부분의 UNIX 계열에서 비슷한 값을 보여주며, 33번부터 62번까지는 아마도 OS 마다 약간식의 차이를 보여줄것이다. 각각의 시그널은 int 형의 숫자로 표시되는데, 시그널 번호에 따라서 다른 상황을 나타낸다.
Ctrl-c 를 누른 순간 SIGINT신호가 발생되는데 우리는 이 신호를 이용하여 정리를 해주고 나오면 된다.예제로 살펴본다. (예제: sigint.c)
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
void sig_handler(int signo); // SIGINT 핸들러 함수
unsigned char endflag = 1;
int main()
{
int i = 0;
signal(SIGINT, (void *)sig_handler);
while(endflag)
{
printf("%d\n", i);
i++;
sleep(1);
}
return 1;
}
void sig_handler(int signo)
{
printf("process stop\n");
endflag = 0;
}
실습을 진행하면서 GPIO핀을 처음 상태로 초기화 시키고 빠져나오게 하기 위해 위 코드를 이용하면 될것이다. 따라서 스마트 홈 액츄에이터 시험 코드는 실습중에 Ctrl-c 를 눌러 빠져나올 때 이전 상태를 초기화 시키는 코드를 추가하여 작성할 것이다. 그래야만 전등이나 RGB LED를 비롯한 액츄에이터가 On 되어 있는 채로 프로그램을 빠져나오는 것을 방지 할 수 있다.
아래 코드는 SIGINT 핸틀러 함수를 등록한다. 헤더파일을 포함하는 것을 기억한다.
#include <signal.h>
.
.
.
void sig_handler(int signo); // SIGINT 핸들러 함수
함수를 SIGINT 발생시 실행하도록 등록하고 같은 이름으로 함수를 작성한다.
int main()
{
.
signal(SIGINT, (void *)sig_handler);
.
.
.
}
void sig_handler(int signo)
{
printf("process stop\n");
endflag = 0;
}
여기까지... 무조건 한다.

취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.
귀사가 성공하기까지의 긴 고난의 시간을 캐어랩과 함께 하세요.
캐어랩