[signal 질문] signal 질문입니다.
글쓴이: kjw7945 / 작성시간: 화, 2005/07/12 - 12:02오전
1 #include <signal.h> 2 #include <unistd.h> 3 4 void sig_handler(int signo); 5 6 int main() 7 { 8 int i = 0; 9 printf("Program start\n"); 10 11 if ( signal(SIGHUP, (void *)sig_handler ) == SIG_ERR ) 12 { 13 perror("signal set error : "); 14 exit(0); 15 } 16 17 while(1) 18 { 19 printf("%d\n", i); 20 i++; 21 sleep(1); 22 } 23 24 return 1; 25 } 26 27 void sig_handler(int signo) 28 { 29 execl("./sig_hp", 0); 30 }
1.
위의 코드를 컴파일 한 후 실행 후에 SIGHUP 발생하면
한번은 잘 실행됩니다. 그런데 제가 잘 모르는 부분은
어째서 시그널을 인식하고 잘 실행이 되는가 입니다.
첫 시작은
1, 2, 3, 4, 5 숫자가 계속 증가하면서 화면에 찍습니다.
17 ~ 22번 라인이 계속 실행 되는 거죠. 그러다 kill 명령어
시그널을 주면 다시 프로그램이 실행 됩니다. 근데 궁금한
것이 17~22번 라인이 실행되고 있는데 어째서 시그널을
발생시키면 11번 라인이 실행 되는지 궁금합니다.
C언어는 인터프린터 언어인데..... 어떻게 위의 11번
라인에 걸려서 실행이 되는지 궁금합니다.
2.
위의 코드를 컴파일 한후
kill 명령어를 이용해서 SIGHUP 발생시키면
다시 실행 됩니다.
그런데 다시 한번 또 실행시키면 다시 실행이 안되네요.
그 이유를 잘 몰르겠습니다.
Forums:
C 는 인터프리터 언어가 아닙니다. :)1. 시그널에 대해서 조금
C 는 인터프리터 언어가 아닙니다. :)
1. 시그널에 대해서 조금 더 자세하게 알아보셔야 할것 같군요.
실행하고 나서 SIGHUP 을 발생시켰을때,
프로그램의 실행이 11번 라인으로 되돌아 가는것이 아닙니다.
11번 라인의 signal() 함수 콜은
"이 프로세스에게 SIGHUP 시그널이 온다면 sig_handler 라는 함수를 실행하라"
라고 커널에 알려주는 역할입니다.
이 이후 SIGHUP 이 프로세스에게 전달되면,
커널은 프로그램의 수행을 sig_handler 라는 함수로 "임시로" 옮깁니다.
sig_handler 의 수행이 끝나면 다시 시그널을 받은 위치로 돌아와서 계속 수행하죠.
사실, 이 signal 처리에 대한 부분은 C 언어에서 다루는 부분이 아닙니다.
순수하게 OS 의존적인 부분이죠.
2. signal handler 가 정상적으로 종료되지 않았기 때문으로 보입니다.
signal handler 에서 현재 프로세스 내용을 바꿔 버렸습니다(exec() 콜)
즉, SIGHUP signal 에 대한 처리가 끝나지 않은 상태로 프로세스가 수행중이기 때문에
더이상 SIGHUP 에 대한 signal handler 수행을 하지 못하는 상태가 됩니다.
답변 감사합니다. ^^
답변 감사합니다. ^^
댓글 달기