본문으로 바로가기

바다야크

  1. Home
  2. 컴퓨터/프로그래밍
  3. C언어 시그널 대기 상태로 설정 함수 sigpromask()

C언어 시그널 대기 상태로 설정 함수 sigpromask()

· 댓글개 · 바다야크

C함수 시그널 대기 상태로 설정 sigpromask()

다른 일에 방해받지 말고 매우 중요한 일을 반드시 처리해야 할 경우가 있습니다. 매우 중요한 일이라 시그널이 발생하더라도 일을 먼저 처리하고 나중에 발생한 시그널을 처리하고 싶습니다. 이렇게 시그널이 발생하더라도 대기상태로 만들어 주는 함수가 sigprocmask()입니다.

  • 헤더: signal.h
  • 형태: int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
  • 인수: int how 시그널 집한을 어떻게 처리할지 방법을 지정
    sigset_t *set 이번에 설정할 시그널 집합
    sigset_t *oldset 이전에 블록된 시그널 집합
  • 반환: 0 == 성공, -1 == 실패

시그널 집합에 대해 how 인수값에 아래와 같은 상수 값으로 블록 여부를 지정합니다.

   int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

how 의미
SIG_BLOCK 기존에 블록화된 시그널 집합에 두 번째 인수 set 시그널 집합을 추가
SIG_UNBLOCK 기존에 블록화된 시그널 집합에서 두번째 인수 set 시그널 집합에 있는 시그널을 제거
SIG_SETMASK 이전 블록된 시그널 집합을 모두 지우고 두 번째 인수인 set 시그널 집합으로 설정

Ctrl-C 키를 누르면 프로그램이 바로 종료되지만, sigprocmask()로 중요한 일을 하는 동안에는 SIGINT를 대기시켜놓았습니다. 그리고 블록을 해제하면 그때서야 Ctrl-C키에 의해 발생한 SIGINT가 처리되어 프로그램이 종료됩니다.

C언어 sigpromask() 함수 예제

#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 = 10; 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;
}

C언어 sigpromask() 예제 실행 결과

]$ ./a.out
카운트 다운 10
카운트 다운 9
카운트 다운 8
^C카운트 다운 7     <- 여기서 Ctrl-C 키를 눌렀습니다.
카운트 다운 6
카운트 다운 5
카운트 다운 4
카운트 다운 3
카운트 다운 2
카운트 다운 1
Ctrl-C에 대한 블록을 해제합니다.

]$
SNS 공유하기
💬 댓글 개
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.