1. 개념과 개요

System Program/signal 2014. 2. 19. 13:43

프로세스에 가해지는 소프트웨어적인 인터럽트라고 이해하면 쉽다.

 

1. 시그널의 범주

 

전통적 또는 표준 시그널이라는 두 가지의 큰 범주로 나누어진다. 리눅스에서 표준 시그널은 1 ~ 31까지의 범위이다.

그 이외의 범위는 실시간 시그널에 해당된다.

 

2. 기본 동작

 

시그널이 프로세스에 전달되면 다음 중 하나의 기본 동작을 수행한다.

 

- 시그널이 무시된다. 커널에 의해 버려지고 프로세스에는 아무런 영향이 없다.

- 프로세스를 종료한다. 비 정상적 프로세스 종료라고 한다.

- 코어 덤프 파일을 생성하고 프로세스를 종료한다.

- 프로세스를 멈춘다.

- 이전에 멈췄던 프로세스의 실행을 재개한다.

 

3. 속성 변경

 

시그널의 기본 동작을 변경할 수 있는데 이를 속성 변경이라고 하며 아래 중 하나로 변경할 수 있다.

 

- 기본 동작 수행 (이전에 변경된 속성을 원래되로 돌리는 경우를 말함)

- 시그널을 무시한다. (종료가 기본 동작인 시그널에 유용하다)

- 시그널 핸들러를 실행한다.

 

* 시그널 핸들러에서 기본동작 수행과 시그널 무시는 핸들러 함수 대신에 각각 SIG_DFL과 SIG_IGN으로 핸들러 함수를 대신할 수 있다.

 

4. 속성 변경 예시

 

/*
* main.c -- C Test App.
*
* Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>

void signal_handler(int sig)
{
	if(sig == SIGINT)
		printf("SIGINT is tranfered \n");
	
	if(sig == SIGQUIT)
	{
		printf("SIGQUIT is tranfered \n");
		exit(1);
	}
	
}

int main(int argc, char *argv[])
{
	if(signal(SIGINT, signal_handler) == SIG_ERR)
	{
		printf("signal error\n");
		exit(1);
	}

	if(signal(SIGQUIT, signal_handler) == SIG_ERR)
	//if(signal(SIGQUIT, SIG_DFL) == SIG_ERR)
	{
		printf("signal error\n");
		exit(1);
	}	
	
	//while(getchar() != 'q');
	for(;;)
	{
		printf("main function is paused, PID = %d \n", getpid());
		pause();
	}
	
	return 0;
}

 

[설명]

SIGINT과 SIGQUIT의 기본 동작을 별도의 시그널 핸들러 함수를 통하여 변경하였다.

SIGQUIT의 기본 동작은 비 정상적인 프로세스 종료를 유도하고 디버깅을 위한 코어덤프를 수행하는 것이다.

이 예제에서는 비 정상적인 종료라는 기본동작을 변경하여 정상적인 종료 동작을 하도록 강제로 변경하였다.

예제로써 적절한 것 같지는 않지만 동작성을 읽히는데 포커스를 둔다.

 

: