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가 되겠습니다.
그래서, 위 코드를 좀 이해하기 쉽게(?) 약간 수정해 봅니다.
#include<signal.h> #include<stdio.h> #include<unistd.h> void ouch(int sig) { static int cnt=0; cnt++; printf("OUCH! - I got signal %d 회수=%d\n",sig, cnt); if ( cnt == 3) (void) signal(SIGINT,SIG_DFL); //(void) signal(SIGINT,SIG_IGN); } int main() { (void)signal(SIGINT,ouch); while(1){ printf("Hello World!\n"); sleep(1); } }위는 SIGINT가 발생하면 ouch를 실행합니다.
그러나, 3번째 SIGINT가 발생하면, 핸들러를 ouch에서 default로 바꿉니다.(여기서는 핸들러를 바꾸기만/등록만 하지요.)
그리고, 4번째 SIGINT가 발생하면, 새로 바꾸어놓은 SIG_DFL을 실행하겠지요.
* 참고로, signal은 reliable하지 않으며, sigaction
* 참고로, signal은 reliable하지 않으며, sigaction을 사용하기를 권장합니다.
댓글 달기