[OS] SIGALRM 동작
Linux signal 종류 중 SIGALRM
의 동작에 대해 알아본다.
기본적으로 alarm() 함수를 통해 signal을 줄 수 있으며, 인자로 “초”를 받는다. Signal number는 14번이다.
#include <unistd.h> unsigned int alarm(unsigned int seconds);
Argument | Description |
---|---|
unsigned int seconds | 알람을 주고자 하는 초 0을 넣게 되면 이전 알람을 취소 |
Return | Description |
---|---|
0 | 이전에 설정된 알람이 없음 |
양수 | 이전에 alarm() 호출로 시그널이 발생하기 까지 남은 시간 |
Example
#include <unistd.h> #include <stdio.h> #include <signal.h> void my_sig(int signo) { printf("my_sig(%d)\n", signo ); alarm(1); } int main() { signal( SIGALRM, my_sig ); alarm(1); while(1); return 0; }
$ ./a.out my_sig(14) my_sig(14) my_sig(14) ^C
위 프로그램은 주기적으로 alarm signal을 catch function을 통해 새로운 동작을 설정해서 출력시킨다.
Signal 보류 처리
모든 signal (총 64개)을 관리할 때 사용하는 다양한 함수들이 존재한다. 내부 signal set은 추상화 되어있어서, 지원하는 함수를 통해서 설정 할 수 있다.
sigemptyset
set의 모든 signal을 0으로 설정한다.
sigfillset
set의 모든 signal을 1로 설정한다.
sigaddset
set의 멤버로 signo로 지정된 signal을 추가한다.
sigdelset
set에서 signo로 지정된 signal을 제거한다.
sigismember
signo signal이 set의 멤버인지를 검사한다.
sigprocmask
int sigprocmask(int how, const sigset_t *set, sigset_t oldset);
Argument | Description |
---|---|
int how | SIG_BLOCK : 기존 모든 signal을 block SIG_UNBLOCK : 기존 모든 signal을 unblock SIG_SETMASK : 기존의 블록된 signal을 전부 제거시키고 새로운 set의 signal들을 복구 |
const sigset_t *set | Signal set의 객체 |
sigset_t oldset | 새롭게 setting되기 전 set의 backup을 위한 set 객체 |
Example
#include <signal.h> #include <unistd.h> int main() { sigset_t set; sigset_t oldset; sigemptyset(&set); sigaddset(&set, SIGINT); sigprocmask( SIG_BLOCK, &set, &oldset); sleep(3); sigprocmask( SIG_SETMASK, &oldset, 0); while(1); return 0; }
위 프로그램은 3초동안 모든 signal을 block 했다가 3초 뒤에 기존 signal을 복원하는 프로그램이다.