글 수 16
2008.01.02 10:08:33 (*.33.84.154)
51513
설명
다른 일에 방해 받지 말고 매우 중요한 일을 반드시 처리해야 할 경우가 있습니다. 매우 중요한 일이라 시그널이 발생하더라도 일을 먼저 처리하고 나중에 발생한 시그널을 처리하고 싶습니다. 이렇게 시그널이 발생하더라도 대기상태로 만들어 주는 함수가 sigprocmask()입니다.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
시그널 집합에 대해 how 인수값에 아래와 같은 상수 값으로 블록 여부를 지정합니다.
how | 의미 |
SIG_BLOCK | 기존에 블록화된 시그널 집합에 두 번째 인수 set 시그널 집합을 추가 |
SIG_UNBLOCK | 기존에 블록화된 시그널 집합에서 두번째 인수 set 시그널 집합에 있는 시그널을 제거 |
SIG_SETMASK | 이전 블록된 시그널 집합을 모두 지우고 두 번째 인수인 set 시그널 집합으로 설정 |
헤더 | signal.h | |||||||
형태 | int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); | |||||||
인수 |
|
|||||||
반환 |
|
예제
Ctrl-C 키를 누르면 프로그램이 바로 종료되지만 sigprocmask()로 중요한 일을 하는 동안에는 SIGINT를 대기시켜놓았습니다. 그리고 블록을 해제하면 그때서야 Ctrl-C키에 의해 발생한 SIGINT가 처리되어 프로그램이 종료됩니다.
#include <stdio.h> #include <unistd.h> #include <signal.h> int main( void) { sigset_t sigset; int ndx; sigemptyset( &sigset); sigaddset( &sigset, SIGINT); sigprocmask( SIG_BLOCK, &sigset, NULL); // 중요한 일 시작 --------- for ( ndx = 3; 0 < ndx; ndx--) { printf( "카운트 다운 %d\n", ndx); sleep( 1); } // 중요한 일 종료 --------- printf( "Ctrl-C에 대한 블록을 해제합니다.\n"); sigprocmask( SIG_UNBLOCK, &sigset, NULL); printf( "카운트 다운 중에 Ctrl-C키를 누르셨다면,\ 이 문장도 출력이 안됩니다.\n"); while ( 1 ) ; return 0; }
]$ ./a.out 카운트 다운 3 카운트 다운 2 <--- 여기서 Ctrl-C 키를 눌렀습니다. 카운트 다운 1 Ctrl-C에 대한 블록을 해제합니다. ]$