설명

시그널 집합  변수에 시그널을 추가합니다. 즉,sigaddset(sigset_t *set, int signum); 을 호출하면 시그널 집합 변수 set에 시그널 번호 signum 을 추가합니다.

리눅스에서 매우 다양한 시그널이 있습니다. 이 시그널을 하나씩 처리할 때가 있다면 여러 개를 하나로 묶어서 한꺼번에 처리하는 것이 편할 때가 있습니다. 이렇게 필요한 시그널을 하나의 집합으로 묶어 주는 함수가 준비되어 있는데 그 중에 하나가 빈 주머니를 만들듯이 빈 집합을 만들어 주는 함수가 sigemptyset()입니다. 이제 여기 다가 아래의 시그널 중에 필요한 시그널을 하나씩 넣어서 필요한 시그널 집합을 만드시면 되겠습니다.

시그널 이름 내용
SIGABRT abord() 함수를 호출하면 발생하며, 이 시그널을 받으면 코어 덤프하고 프로그램은 종료됩니다.
SIGALRM alarm() 함수를 호출하면 발생하며, 이 시그널을 받으면 프로세스는 종료됩니다.
SIGBUS 하드웨어 결함이 탐지되면 발생하며, 이 시그널을 받으면 프로세스는 종료됩니다.
SIGCHLD 자식 프로세스가 종료될 때 부모 프로세스에 전달됩니다.
SIGCONT 중단된 프로세스가 이 시그널을 받으면 다시 활성화되어 실행이되며, 이미 실행 중이라면 무시됩니다.
SIGFPE 0으로 나누거나 부동소수점 오류 등이 생기면 발생하며, 프로세스는 코어 덤프 후에 종료됩니다.
SIGHUP 터미널 연결이 끝어지면 이 터미널과 연결된 세션 리더 또는 세션에 속한 모든 프로세스에게 전달되면, 전달 받은 프로세스는 종료됩니다.
SIGILL 불법 명령어를 실행할 때 발생하며, 이 시그널을 받으면 코어 덤프 후에 종료합니다.
SIGINT 터미널에서 인터럽트 키 중의 하나인 Ctrl-C 를 눌렀을 때 발생하며, 프로세스는 종료됩니다.
SIGKILL 프로세스를 종료하기 위해 전송되며, 시그널을 받은 프로세스는 반드시 종료합니다.
SIGPIPE 이미 닫힌 파이프에 쓰기를 할 때 발생하며, 이 시그널을 받으면 종료합니다.
SIGQUIT 터미널에서 종료키인 Ctrl-\를 눌렀을 때 발생하며, 프로세스는 코어 덤프 후에 종료합니다.
SIGSEGV 잘못된 메모리 주소를 접근할 때 발생하며, 이 시그널을 받은 프로세스는 코어 덤프 후에 종료합니다.
SIGSTOP 프로세스를 멈추기 위해 보내지며, 이 시그널을 받은 프로세스는 반드시 멈춥니다.
SIGSYS 잘못된 시스템 호출을 했을 때 보내지며, 이 시그널을 받은 프로세스는 코어 덤프 후에 종료합니다.
SIGTERM 프로세스가 종료 전에 처리해야될 작업을 처리할 수 있도록 종료 전에 미리 보내 집니다.
SIGSTP 터미널에서 프로세스를 잠시 멈추게 하기 위해 Ctrl-Z키를 눌렀을 때 전송되며, 이 시그널을 받은 프로세스는 멈춤이 됩니다.
SIGTTIN 백그라운드에서 작업 중인 프로세스가 표준 입력을 사용하려 할 때 현재 실행 중인 프로세스에 전송되며, 이 시그널을 받은면 멈춤상태가 됩니다.
SIGTTOU 백그라운드에서 작업 중인 프로세스가 표준 출력을 사용하려 할 때 현재 실행 중인 프로세스에 전송되며, 이 시그널을 받은면 멈춤상태가 됩니다.
SIGURS1 사용자 정의로 사용할 수 있는 시그널로, 이 시그널을 받으면 프로세스는 종료합니다.
SIGURS2

시그널 집합을 만드는 함수는 여러 가지가 있습니다. 그 중에 sigemptyset(), sigaddset(), sigdelset()을 그림으로 표현하면 아래와 같습니다.

헤더 signal.h
형태 int sigaddset(sigset_t *set, int signum);
인수
sigset_t *set 시그널 집합 변수
int signum 시그널 번호
반환
0 집합 변수에 성공적으로 추가했음
-1 실패했음

예제

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

int main( void)
{
   sigset_t set;

   sigemptyset( &set);        // 시그널 집합 변수의 내용을 모두 제거합니다.
   sigaddset( &set, SIGINT);  // 시그널 집합 변수에 SIGINT를 추가합니다.

   // SIGINT 가 등록되었는지 확인합니다.

   switch( sigismember( &set, SIGINT))
   {
   case 1   :  printf( "SIGINT는 포함되어 있습니다.\n");
               break;
   case 0   :  printf( "SIGINT는 없습니다.\n");
               break;
   default  :  printf( "sigismember() 호출에 실패했습니다.\n");
   }

   // SIGSYS 가 등록되었는지 확인합니다.

   switch( sigismember( &set, SIGSYS))
   {
   case 1   :  printf( "SIGSYS는 포함되어 있습니다.\n");
               break;
   case 0   :  printf( "SIGSYS는 없습니다.\n");
               break;
   default  :  printf( "sigismember() 호출에 실패했습니다.\n");
   }

   return 0;
}
]$ ./a.out
SIGINT는 포함되어 있습니다.
SIGSYS는 없습니다.
]$