C)라즈베리파이 시그널 처리

Dora·2020년 12월 5일
0

특정 프로세스가 다른 프로세스에게 보내는 신호.
인터럽트와 반대로 소프트웨어적인 이벤트에 속한다.

  • 시그널 처리 순서
  1. 시그널을 받은 프로세스는 현재의 수행 제어 흐름을 정지
  2. 시그널 처리기를 실행
  3. 시그널 처리가 끝난 후 원래의 수행 제어 흐름을 회복

시그널 처리 프로그램 예 1 - 핸들러

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

int alarmFlag = 1;

void alarmHandler() {
	printf("An alarm clock signal was received \n");
	alarmFlag = 0;
}

void main() {
	signal(SIGALARM, alarmHandler);
	alarm(3);
	printf("Looping... \n");
	while(alarmFlag)
		pause();
	printf("Loop ends due to alarm signal \n");
}

signal(SIGALRM, alarmHandler); // 시그널 처리기 설치.
: SIGALRM에 해당되면 핸들러 실행.
// 기본형 : signal(int signum, void(*handler function)(int))
// SIGALRM = 알람 클락 시그널로 해당 알람이 끝나면 발생되는 시그널

alarm(3);
: 3초 동안 알람 실행

while(alarmFlag)
ㅤㅤpause();
: alarmFlag가 1이면 대기.

결론 : alarm이 울리고 3초가 지나면 SIGALRM이 발동되어 alarmHandler가 호출되어 alarmFlag가 0이 되면 main함수가 종료된다.

시그널 처리 프로그램 예 2 - 이전 처리기

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

void main() {
	void (*oldHandler)();
	printf("I can be Control-C'ed \n");
	sleep(3);
    
	oldHandler = signal(SIGINT, SIG_IGN);
	printf("I'm protected from Control-C now \n");
	sleep(3);
    
	signal(SIGINT, oldHandler);
	printf("I can be Control-C'ed again \n");
	sleep(3);
	printf("Bye! \n");
}

sleep(3);
: 3초간 작업 대기 상태로.

oldHandler = signal(SIGINT, SIG_IGN);
: 이전 처리기 값을 oldHandler에 저장한다.
// SIGINT : 인터럽트로 Ctrl+c 입력 시 발생하는 시그널.
// SIG_IGN : 시그널을 무시하도록 설정. 단, SIGKILL과 SIGSTOP은 무시할 수 없다.

profile
Lv.1 개발자

0개의 댓글