카테고리 없음

Ctrl-c 로 프로세스 종료시 주의할 점

지구빵집 2023. 5. 10. 18:20
반응형

 

 

액츄에이터 제어 실습시 보통 실험을 종료할 경우 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;
}

 

여기까지... 무조건 한다.

 

 

리눅스 SIGINT

 

 

반응형