글 수 16
2007.12.23 16:20:24 (*.238.109.89)
44614
설명
sigemptyset()함수가 시그널 집합 변수의 모든 시그널 정보를 삭제했다면 sigfillset() 함수는 모든 시그널을 추가합니다.
리눅스에서 매우 다양한 시그널이 있습니다. 이 시그널을 하나씩 처리할 때가 있다면 여러 개를 하나로 묶어서 한꺼번에 처리하는 것이 편할 때가 있습니다. 이렇게 필요한 시그널을 하나의 집합으로 묶어 주는 함수가 준비되어 있는데 그 중에 하나가 빈 주머니를 만들듯이 빈 집합을 만들어 주는 함수가 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 sigfillset( sigset_t *set); | |||||
인수 |
|
|||||
반환 |
|
예제
#include <stdio.h> #include <signal.h> int main( void) { sigset_t 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; }
]$ ./a.out SIGINT는 포함되어 있습니다. SIGSYS는 포함되어 있습니다. ]$