C함수 시그널 집합에 모든 시그널 정보 추가 sigfillset()
sigemptyset() 함수는 시그널 집합 변수의 모든 내용을 삭제한다면, sigfillset() 함수는 시그널 집합 변수에 모든 시그널을 추가합니다.
- 헤더: signal.h
- 형태: int sigfillset(sigset_t *set)
- 인수: sigset_t *set 시그널 집합 변수
- 반환: 0 == 집합 변수에 모든 시그널 정보를 넣었음
-1 == 실패했음
리눅스에는 매우 다양한 시그널이 있습니다. 이 시그널을 하나씩 처리하거나 여러 개를 하나로 묶어서 한꺼번에 처리할 수 있습니다. 시그널 집합에 sigfillset(), sigemptyset(), sigaddset(), sigdelset()으로 시그널을 추가·삭제할 수 있으며 sigismember()로 시그널 존재 여부를 확인할 수 있습니다. 그림으로 표현하면 아래와 같습니다.
시그널의 종류는 아래와 같습니다.
시그널 | 설명 |
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 |
C언어 sigfillset() 함수 예제
sigaddset() 함수로 시그널을 개별로 등록한 결과와 sigfillset() 함수로 모든 시그널을 등록한 결과를 비교하는 예제입니다.
#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");
}
///////////////////////////////////////////////////// sigfillset()
printf( "sigfillset() 호출 후\n");
sigemptyset( &set); // 시그널 집합 변수의 내용을 모두 제거합니다.
sigfillset( &set);
// 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;
}
C언어 sigfillset() 예제 실행 결과
]$ ./a.out
SIGINT는 포함되어 있습니다.
SIGSYS는 없습니다.
sigfillset() 호출 후
SIGINT는 포함되어 있습니다.
SIGSYS는 포함되어 있습니다.
]$
'컴퓨터 > 프로그래밍' 카테고리의 다른 글
C언어 두개의 문자열을 합침 함수 strcat() (0) | 2020.03.15 |
---|---|
C언어 시그널 집합에 시그널이 있는지 확인 함수 sigismember() (0) | 2020.03.15 |
C언어 시그널 집합에서 시그널을 제거 함수 sigdelset() (0) | 2020.03.15 |