OS,  Study

[OS] SIGALRM 동작

Linux signal 종류 중 SIGALRM의 동작에 대해 알아본다.

기본적으로 alarm() 함수를 통해 signal을 줄 수 있으며, 인자로 “초”를 받는다. Signal number는 14번이다.

#include <unistd.h>

unsigned int alarm(unsigned int seconds);
ArgumentDescription
unsigned int seconds알람을 주고자 하는 초
0을 넣게 되면 이전 알람을 취소
ReturnDescription
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);
ArgumentDescription
int howSIG_BLOCK : 기존 모든 signal을 block
SIG_UNBLOCK : 기존 모든 signal을 unblock
 SIG_SETMASK : 기존의 블록된 signal을 전부 제거시키고 새로운 set의 signal들을 복구
const sigset_t *setSignal 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을 복원하는 프로그램이다.

Leave a Reply

Your email address will not be published. Required fields are marked *