-
[Unix] 시그널 처리운영체제/Unix 2019. 5. 14. 18:34
시그널
- 시그널
- 시그널 처리
- 시그널 보내기
- 시그널과 비지역 점프
목표
- 시그널 처리기에 대해 이해한다.
- 간단한 예제들을 이용해 시그널을 처리해본다.
시그널 처리기란? signal()
- 시그널에 대한 처리 함수를 지정
- 시그널을 처리하는 함수가 존재 signal() 시스템 호출
#include <signal.h> signal(int signo, void (*func)())
- signo는 앞의 포스팅에서 설명한 시그널의 종류
- func는 실행할 함수
- SIG_IGN : 시그널 무시
- SIG_DFL : 기본 처리 - 예제
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void alarmHandler(); /* 알람 시그널을 처리한다. */ int main( ) { int sec = 0; signal(SIGALRM,alarmHandler); alarm(5); /* 알람 시간 설정 */ printf("infinite loop \n"); while (1) { sleep(1); printf("%d sec passed \n", ++sec); } printf("실행되지 않음 \n"); } void alarmHandler() { printf("wake up please!\n"); exit(1); }
signal ( SIGALAM , alarmHander ) // 알람 시그널을 처리하는 코드 alarmHander라는
함수로 이동하여 실행 후 exit(1)를 만나므로 종료- 위의 예제에서 exit(1)를 빼면 어떠한 결과가 생길까?
자동으로 프로세스가 종료되지 않는다.
시그널 처리기란? sigaction()
- signal() 보다 정교하게 시그널 처리기를 등록하는 함수
- sigaction 구조체를 사용하여 정교한 시그널 처리 액션을 등록
#include <signal.h> int sigaction (int signum, const struct sigaction * act, struct sigaction *oldact);
- sigaction 구조체
struct sigaction { void (*sa_handler)(int); void (*sa_sigavtion)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; }
sigaction 구조체
void (*sa_handler)(int);는 시그널 처리기
sigset_t sa_mask; 시그널을 처리하는 동안 차단할 시그널의 집합- 예제
#include <stdio.h> #include <signal.h> struct sigaction newact; struct sigaction oldact; void sigint_handler(int signo); int main(void) { newact.sa_handler = sigint_handler; // 시그널 처리기 지정 sigfillset(&newact.sa_mask); // 모든 시그널 봉쇄 // SIGINT를 지정하면서 oldact에 기존 처리기 정보를 저장한다. sigaction(SIGINT, &newact, &oldact); while(1) { printf("press Ctrl-C\n"); sleep(1); } } void sigint_handler(int signo) { printf("signal no: %d \n", signo); printf("This will end if you press Ctrl-C again\n"); sigaction(SIGINT, &oldact, NULL); }
정리 및 느낀 점
- 간단한 시그널 처리기인 signal, sigaction 함수를 알아보고 사용해보았다.
출처
- 창병모, 리눅스 프로그래밍, 생능출판사, 2014.
728x90'운영체제 > Unix' 카테고리의 다른 글
[Unix] 파이프 (0) 2019.05.21 [Unix] 한눈에 보는 유닉스 (0) 2019.05.18 [Unix] 시그널 (0) 2019.05.14 [Unix] 파일 상태 정보 (0) 2019.05.08 [Unix] 파일 잠금 함수 : fcntl() (0) 2019.05.08