유닉스는 시그널 정보 출력 / 올 때까지 기다리기 / 시그널 보내기 등 시그널 처리와 관련된 기타 함수 제공함
시그널 정보 출력
psignal, strsignal
#include <siginfo.h>
#incldue <string.h>
void psignal(int sig, const char *s);
char *strsignal(int sig);
- sig : 정보 출력할 시그널
- s: 출력할 문자열
- psignal : s에 지정한 문자열 출력 후 sig로 지정한 시그널 가리키는 이름 붙여 표준 오류로 출력
- strsignal : 인자로 받은 시그널 가리키는 이름을 문자열로 리턴, 받은 시그널 없으면 NULL 리턴
시그널 블록킹과 해제
프로세스가 동작하는 동안 특정 시그널들을 받지 않도록 블록 / 해제 가능
sighold, sigrelse - 시그널 블록, 해제
인자로 받은 시그널을 시그널 마스크에 추가, 해제함
#include <signal.h>
int sighold(int sig);
int sigrelse(int sig);
void handler(int signo){
char *s;
s = strsignal(signo);
printf("received signal :%s\n",s);
}
int main(){
sigset(SIGINT, handler);
sighold(SIGINT);
pause();
return 0;
}
- ctrl+c로 안 끝날 경우 ctrl+z로 백그라운드로 넘긴 후 kil -9 id 명령으로 죽여야 함
sigprocmask - 시그널 집합 블록 / 해제
한 번에 여러 시그널 블록 가능
#include <signal.h>
int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
int main(){
sigset_t new;
sigemptyset(&new);
sigaddset(&new, SIGINT);
sigaddset(&new, SIGQUIT);
sigprocmask(SIG_BLOCK, &new, (sigaset_t *)NULL); //블록함
kill(getpid(), SIGQUIT);
sigprocmask(SIG_UNBLOCK, &new, (sigset_t *)NULL); //해제함
//프로세스가 기다리고 있던 SIGQUIT 시그널 받고 코어 덤프 생성하며 종료
}
- how : 시그널 블록 / 해제 여부
- SIG_BLOCK : set에 지정한 시그널 집합을 시그널 마스크에 추가
- SIG_UNBLOCK : set에 지정한 시그널 집합을 시그널 마스크에서 제거
- SIG_SETMASK : set에 지정한 시그널 집합으로 현재 시그널 마스크 대체
- set : 블록 / 해제할 시그널 집합 주소
- oset : NULL or 이전 설정값 저장할 시그널 집합 주소 (일반적으로 NULL)
시그널 기다리기
sigpause - 시그널 대기
인자로 지정한 시그널을 프로세스 시그널 마스크에서 제거, 프로세스가 시그널 받을 때까지 기다림
#include <signal.h>
int sigpause(itn sig);
- sig : 시그널 올 때까지 대기할 시그널
sigsuspend - 시그널 기다리기
- wiat하는 함수에서 많이 사용함
- 인자로 지정한 시그널 집합에 설정된 시그널들로 프로세스의 시그널 마스크 교체
- 블록되지 않은 시그널 도착할 때까지 프로세스 수행 멈추고 기다림
- 시그널 도착 시 시그널 마스크는 이전 설정으로 돌아감
#include <signal.h>
int sigsuspend(const sigset_t *set);
void handler(int signo){
psignal(signo, "received signal:");
}
int main(){
sigset_t set;
sigset(SIGALRM, handler);
sigfillset(&set);
sigdelset(&set, SIGALRM);
//알람 제외 모든 시그널 다 set에 넣음
alarm(3);
printf("wait\n");
sigsuspend(&set);
//알람 시그널 발생 전에 SIGINT 시그널 보내도 모두 블락 처리되록 알람 시그널만 처리됨
}
- set : 기다리려는 시그널 지정한 시그널 집합 주소
sigsend - 시그널 보내기
sig로 지정한 시그널을 id에 지정한 프로세스나 프로세스 그룹에 보냄
#incldue <signal.h>
int sigsend(idtype_t idtype, id_t id, int sig);
- idtype :id에 지정한 값의 종류
- P_PID, P_PGID, P_SID 등
- id : 시그널을 받을 프로세스나 프로세스 그룹
- sig : 보내려는 시그널
- kill 함수와 다른 점
- 특정 프로세스 뿐만 아니라 프로세스 그룹 등 시그널 받을 대상 다양하게 지정 가능
- PID가 0인 프로세스는 시그널 보내는 대상에서 항상 제외됨
PID 1인 프로세스도 제외됨 (P_PID로 직접 지정할 경우 제외)
sigignore - 시그널 무시 처리
인자로 지정한 시그널의 처리 방법을 SIG_IGN으로 설정
#incldue <signal.h>
int sigignore(int sig);
- sig : 무시할 시그널