보안세상

Signal(시그널)신호 본문

공부

Signal(시그널)신호

똔민 2016. 12. 4. 19:05
반응형

sigaction()함수와 그에 대한 구조체를 알아본다.


구조체 

struct sigaction

{

void (* sa_handler)(int);

sigset_t sa_mask;

int sa_flags;

};

첫번째 멤버는 함수 포인터. 이  소프트웨어 인터럽트 함수라고 생각하면 된다.

여기서는 singnal이라고 부른다.

자바 - event, 리눅스 - signal 윈도우- message


2번째 멤버는 들러 함수가 호출되는 동안 신호를 블로킹하는 멤버

 이 두번째 멤버에서 또 다시 여러가지 형태의 블로킹 함수가 존재한다.

1. sigemptyset()//블로킹을 셋팅하는데 해당하는 것만 블로킹.

2. sigfillset(sigset_t * set)//전부 블로킹, 인자는 sigset_t형의 포인터형이므로 주소를 인자로 받아야함.

3. sigaddset()//블로킹 추가

4. sigdelset()//블로킹을 지운다.


3번째 멤버는 sigaction 함수인자의 첫 번째 인자를 처리되는 방식을 추가적으로 제어.

 여기서는 쓰지 않아서 0으로 해준다.


아래 변수선언부분을 자세히 보면, 구조체형 변수를 선언한 다음.

핸들러 함수인 smart()함수의 주소를 첫번째 멤버인 함수 포인터에 넣는다.

그러면 핸들러 함수가 해당 함수의 주소에 가서 그 함수를 실행한다.

위 그림은 전체 소스 struct부분을 자세히 설명하면 다음과 같다.





아래는 smart()함수이다. 이것을 만든 부분이다. 핸들러가 이 함수를실행한다.

그리고 실행이 끝나면 종료 된다. exit(0)에 의해서 , exit(0)이 없다면 종료되지 않는다. 즉, 기존의

ctrl+c를 누르면 강제종료되던 것이 종료는 되지 않는다.




sigaction()함수- 이 함수를 호출하고 어떻게 설정하느냐에 따라서 디폴트 동작을 변경할 수 있다.

첫번째 인자는 signal신호를 인자로 받는다.


신호

1.SIGALRM   유발사건: 경보타이머의 만료              디폴트 동작:종료

2.SIGHLD     유발사건: 자식 프로세스빠져 나옴.      디폴트 동작:무시

3.SIGINT       유발사건: 인터럽트 문자(cltr -c)입력   디폴트 동작:종료

4.SIGIO        유발사건:  소켓 입.출력 준비 완료      디폴트 동작:무시

5.SIGPIPE     유발사건:   닫힌 소켓을 쓰려고 시도   디폴트 동작:종료


여기서 우리가하고자 하는 것은 ctrl+c를 눌러도 강제종료가 아닌, 정상종료를 처리하게 하는 것이다. 

그래서 당연히 SIGINT를 쓴다.


두번째 인자는 struct sigaction형 포인터, newaction , 세번째 인자는 oldaction인자.

즉 새로운 설정하는 부분과  기존의 설정을 백업하는 인자이다.

여기서는 두 번째는 당연히 구조체의 주소를 인자로 받는다.백업하는게 없으므로 세번째 인자의 0으로 설정.


실행결과 화면.


ctrl+c를 누르면 종료가 되는것은 마찬가지 이지만, 강제 종료가 아닌 정상종료이다.

그것이 의심간다면, 아까만든 함수인 smart함수에서 exit(0)를 지운다면, 종료가 되지 않는다.

그렇기 때문에 이 코드는 정상종료가 맞다.



반응형
Comments