signal함수 질문입니다.
글쓴이: 소맛라면 / 작성시간: 화, 2005/07/26 - 1:05오전
SIG_DFL이 기본 동작을 복구 한다.
라고 나와있습니다.
그런데 아래 소스를 컴파일해 실행하면 프로세스가 종료해 버립니다..
그럼 기본동작은 종료입니까???
1 #include<signal.h> 2 #include<stdio.h> 3 #include<unistd.h> 4 5 void ouch(int sig) 6 { 7 printf("OUCH! - I got signal %d\n",sig); 8 (void) signal(SIGINT,SIG_DFL); 9 //(void) signal(SIGINT,SIG_IGN); 10 } 11 12 int main() 13 { 14 (void)signal(SIGINT,ouch); 15 16 while(1){ 17 printf("Hello World!\n"); 18 sleep(1); 19 } 20 }
결과는 아래와 같습니다.
[root@localhost chapter11]# ./ctrl Hello World! Hello World! Hello World! ^c OUCH! - I got signal 2 Hello World! Hello World! Hello World! ^c [root@localhost chapter11]#
도대체가 이해가 잘..안갑니다....;;
Forums:
정확하게 기억은 나지 않습니다만..
SIG_DFL이란것이 기본동작을 하도록 하는가 보군요..
유닉스 시그널의 기본동작은 각 시그널에 따라 다릅니다.
SIG_INT의 기본동작은 제가 알기로 Terminate인것으로 기억을 합니다.
물론 기본동작이 무시되거나 core dumped되는 시그널들도
있습니다...
아..그 기본 동작이 라는것이..앞의 매개변수의 기본동작을 말하는 것
아..그 기본 동작이 라는것이..
앞의 매개변수의 기본동작을 말하는 것 이군요... :D
(void) signal(SIGINT,SIG_DFL);
여기서는 SIGINT의 기본동작인 terminate를 하는군요.
감사합니다..(--)(__)(--)꾸벅..
무엇을 위해 사는가..
1. SIGINT가 발생하면 ouch()를 실행한다.2. 그러나, 첫
1. SIGINT가 발생하면 ouch()를 실행한다.
2. 그러나, 첫번째 SIGINT가 발생하면, SIG_DFL을 실행한다.
SIG_DFL즉, Default handler가 되겠습니다.
그래서, 위 코드를 좀 이해하기 쉽게(?) 약간 수정해 봅니다.
위는 SIGINT가 발생하면 ouch를 실행합니다.
그러나, 3번째 SIGINT가 발생하면, 핸들러를 ouch에서 default로 바꿉니다.(여기서는 핸들러를 바꾸기만/등록만 하지요.)
그리고, 4번째 SIGINT가 발생하면, 새로 바꾸어놓은 SIG_DFL을 실행하겠지요.
* 참고로, signal은 reliable하지 않으며, sigaction
* 참고로, signal은 reliable하지 않으며, sigaction을 사용하기를 권장합니다.
댓글 달기