소프트웨어 인터럽트로 프로세스에 뭔가 발생했음을 알리는 간단한 메시지를 비동기적으로 보내는 것.
프로세스를 종료하기 전에 처리할 작업이 남아 있는 경우, 특정 시그널은 종료하고 않고자 하는 경우 시그널을 처리하는 함수를 지정하는 것.
sigaction()
함수는 시그널을 받아 이를 처리할 시그널 핸들러를 지정할 분만 아니라 플래그를 설정해 시그널 처리 과정을 제어할 수도 있다.
kill(getpid(), SIGQUIT);
SIGKILL
과 SIGSTOP
시그널을 제외한 모든 시그널을 지정할 수 있음void sig_handler(int signo){
psignal(signo, "Received Signal");
}
int main(){
signal(SIGINT, sig_handler);
}
SIGKILL
, SIGSTOP
시그널은 못 옴.sigset_t st;
sigemptyset(&st);
sigaddset(&st, SIGINT);
sigaddset(&st, SIGQUIT);
sigismember(&st, SIGINT);
void sig_handler(int signo){
}
main(){
struct sigaction act;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGQUIT);
act.sa_flags = 0;
act.sa_handler = sig_handler;
sigaction(SIGINT, &act, (struct sigaction *)NULL);
}
**SIGINT → Ctrl + C, SIGQUIT → Ctrl + **
특정 시그널의 처리 방법이 핸들러 함수 처리 후 기본 처리 방법으로 재설정됨
void sig_handler(){
}
int main(){
struct sigaction act;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGQUIT);
act.sa_flags = SA_RESETHAND;
act.sa_handler = sig_handler;
sigaction(SIGINT, &act, (struct sigaction *)NULL);
}
void sig_handler(int signo, siginfo_t *st, ucontext_t *uc){
psiginfo(st, "Received Signal");
}
int main(){
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = (void (*)(int, siginfo_t *, void *)sig_handler;
sigemptyset(&act.sa_mask);
sigaction(SIGUSR1, &act, (struct sigaction *)NULL);
}
signal(SIGALRMM, sig_handler);
alarm(2);
sleep(3);
struct itimerval{
struct timeval it_interval;
struct timeval it_value;
};
struct timeval{
time_t tv_sec;
suseconds_t tv_usec;
};
void sig_handler(){
}
int main(){
struct itimerval it;
signal(SIGALRM, sig_handler);
it.it_value.tv_sec = 3;
it.it_value.tv_usec = 0;
it.it_interval.tv_sec = 2;
it.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &it, (struct itimerval *)NULL);
while(1){
getitimer(ITIMER_REAL, &it);
printf("%d sec, ...);
sleep(1);
}
}
int main(){
sigset_t new;
sigemptyset(&new);
sigaddset(&new, SIGINT);
sigaddset(&new, SIGQUIT);
sigprocmask(SIG_BLOCK, &new, (sigset_t *)NULL);
kill(getpid(), SIGQUIT);
sigprocmask(SIG_UNBLOCK, &new, (sigset_t)*NULL);
}