프로세스 종료 전, 처리할 작업이 남았거나 특정 시그널에 대해 종료하고 싶지 않으면 시그널 수행할 함수 지정하면 됨
시그널 붙잡기 : 시그널 확인해 처리하는 일
시그널 핸들러 함수
시그널 핸들러 : 시그널 받았을 때 이를 처리하기 위해 지정된 함수
signal
#include <signal.h>
void (*signal(int sig, void (*disp)(int)))(int);
void handler(int signo){
printf("signal handler signal number : %d\n",signo);
}
int main(){
void (*hand)(int); //시그널 함수 리턴값인 함수 포인터 저장할 변수 선언
hand = signal(SIGINT, handler);
printf("wait 1st ctrl+c);
pause(); //signal 올때까지 실행 중단시킴
}
- sig : 시그널 핸들러로 처리하려는 시그널
- SIGKILL, SIGSTOP 제외하고 모든 시그널 지정 가능
- disp : sig로 지정한 시그널 받았을 때 처리할 방법
- 시그널 핸들러 함수명 (시그널 핸들러의 주소로 점프)
- SIG_IGN : 시그널 무시하도록 지정
- SIG_DFL : 기본 처리 방법으로 처리하도록 지정
- signal 함수는 시그널 들어올 때마다 시그널 핸들러 호출하려면 매번 재 지정해야 함 (유닉스는 이렇게 안해도 됨)
- 실패 시 SIG_ERR 리턴
sigset
#include <signal.h>
void (*sigset(int sig, void (*disp)(int)))(int);
void handler(int signo){
printf("signal handler signal number : %d\n",signo);
}
int main(){
sigset(SIGINT, handelr);
pause();
}
- sig : 시그널 핸들러로 처리하려는 시그널
- SIGKILL, SIGSTOP 제외 모든 시그널 지정 가능
- disp : 시그널 핸들러의 함수명
- 시그널 핸들러 함수 주소
- SIG_IGN
- SIG_DFL
- 시그널 핸들러 함수 주소 리턴
- 실패 시 SIG_ERR 리턴
- 시그널 핸들러 자동으로 재지정
시그널 집합
- POSIX 표준에서 복수의 시그널 처리 위해 도입한 개념
- 시그널을 비트 마스크로 표현 - 시그널 하나가 비트 하나를 가리킴
- 비트값 1 : 해당 시그널 설정됨, 0: 설정 X
- sigset_t 구조체 사용(unsigned int 배열 사용)
시그널 집합 처리 함수
- sigemptyset : 시그널 집합 비우기
- set: 비우려는 시그널 집합의 주소
- 인자로 지정한 시그널 집합을 빈 집합으로 만듬 (0으로 설정)
- sigfillset : 집합의 모든 시그널 설정
- set: 설정하려는 시그널 집합 주소
- 시그널 집합의 모든 비트를 1로 설정
- sigaddset : 시그널 집합에 시그널 설정 추가
- set : 시그널 추가하려는 시그널 집합 주소
- signo : 추가로 설정하려는 시그널
- signo로 지정한 시그널을 set으로 지정한 시그널 집합에 추가
- sigdelset : 시그널 집합에서 시그널 설정 삭제
- set : 시그널 삭제하려는 시그널 집합 주호
- signo : 시그널 집합에서 빼려는 시그널
- signo로 지정한 시그널을 set으로 지정한 시그널 집합에서 제거
- sigismember : 시그널 집합에 설정된 시그널 확인
- set : 확인하려는 시그널 집합 주소
- signo : 확인하려는 시그널
- 성공하면0, 실패하면 -1 리턴 (sigismember는 포함이면 1, 포함X면 0)
#include <signal.h>
#include <stdio.h>
int main(){
sigset_t st;
sigemptyset(&st);
sigaddset(&st, SIGINT);
sigaddset(&st, SIGQUIT);
if(sigismember(&st, SIGINT){
printf("SIGINT is setting\n");
}
printf("bit pattern: %x\n",st.__sigbits[0]);
}
//결과 : bit pattern : 6
//0x06은 00000110, 2,3번째 bit가 1로 설정되어 있음 (SIGINT, SIGQUIT)
- 사용할 때 sigemptyset으로 모두 비우거나 sigfillset으로 모두 1로 설정 후 사용해야 함!
- alarm같은 경우 fillset한 다음 delset해주기