본문으로 바로가기
homeimage
  1. Home
  2. 컴퓨터/프로그래밍
  3. C언어 시그널 블록 설정 및 대기 함수 sigsuspend()

C언어 시그널 블록 설정 및 대기 함수 sigsuspend()

· 댓글개 · 바다야크

C함수 시그널 블록 설정 및 대기 sigsuspend()

sigsuspend() 함수는 시그널 블록을 설정함과 동시에 시그널이 도착할 때까지 중단합니다. 즉, 아래와 같은 처리가 됩니다.

sigprocmask( SIG_SETMASK, &sert, NULL);
pause();

그러나 sigprocmask() 호출과 pause() 호출 사이에도 시그널이 발생할 수 있는데, 이때 발생한 시그널은 잃어버릴 수 있다고 합니다. 예를 들어서 어떨 때는 Ctrl-C 한 번만 누르면 프로그램이 종료되는데, 어떨 때는 2번 눌러야 종료되는 현상 같은 것이죠. 그러므로 블록 설정과 동시에 시그널 도착을 바로 확인해야 시그널을 잃어버리는 일이 없을 것입니다. 이렇게 블록 설정과 함께 시그널을 대기하는 함수가 sigsuspend() 함수입니다.

  • 헤더: signal.h
  • 형태: int sigsuspend(const sigset_t *mask)
  • 인수: sigset_t *mask 블록될 시그널 집합
  • 반환: 0 == 성공, -1 == 실패

C언어 sigsuspend() 함수 예제

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main( void)
{
   sigset_t sigset;
   sigset_t oldset;

   // Ctrl-C를 블록화
   sigemptyset( &sigset);
   sigaddset( &sigset, SIGINT);
   sigprocmask( SIG_BLOCK, &sigset, &oldset);

   printf( "5초 동안 Ctrl-C를 블록화합니다.\n");
   for ( int count = 5; 0 < count; count--){
      printf( "discount %d\n", count);
      sleep( 1);
   }

   // 다시 Ctrl-C를 복구하면서 시그널 대기
   printf( "Ctrl-C를 사용할 수 있습니다.\n");
   sigsuspend( &oldset);

   while( 1){
      printf( "badayak.com\n");
   }
   return 0;
}

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

]$ ./a.out
5초 동안 Ctrl-C를 블록화합니다.
discount 5
discount 4
^Cdiscount 3
discount 2
discount 1
Ctrl-C를 사용할 수 있습니다.


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

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