pause()와 exit()에서의 의문.
프로그래밍을 공부하는 학생으로써 몇가지 질문올립니다.
먼저 exit(),
프로그램에서 라인이 끝나서 종료될경우 굳이 exit()를 쓰지 않아도 정상종료가 되던데,
return이나 exit()없이 정상 종료되는것(리턴형이 void가 아님에도,)은
함수가 끝나면 자동으로 exit()처리를 해주어서입니까? 아니면 그냥 에러가 뜨지 않는것입니까?
두번째, pause()에 대해서인데요.
if((pid = fork()) == 0){ ppid=getppid(); while(1){ pause(); kill(ppid, SIGUSR1); } exit(0); }else{ while(1){ kill(pid, SIGALRM); pause(); } exit(0); }
이렇게 하여 자식과 부모가 대기상대에 있다가 시그널로써 깨어났다가 상대방에게 시그널을 보내고
대기하는, 무한으로 반복되는 형식으로 짰습니다.
또 SIGUSR1을 부모가 받으면 받았다는 메세지를 띄우고,
SIGCHLD로써 자식 프로세스가 종료되는 시점을 알리도록 함수를 설정해놓았습니다.
그런데 이렇게하고 실행하면
child fork()후
child : pause() 실행, child 대기상태
parent : send signal_USR1 to child
parent : pause()
signal : SIGCHLD 이 시점에서 child 종료
parent : send signal_USR1 to child
parent : pause()
이러고 무한대기 ...
이런형식으로 돌아갑니다.
parent의 신호로 child가 깨어나질 않고 그냥 pause()에서 종료 해버립니다.
그리고 parent는 child가 종료되었다는 신호를 받고 한번더 루프를 돌고 대기상태에 들어갑니다.
당연히 child가 없으니 더 이상의 signal은 발생하지 않고, parent는 무한히 기다리는데요.
위 코드에서 child가 pause()에서 깨어 났을때 다음 문장이 아닌, 종료되는 이유는 무엇입니까?
여러 예제들의 문장이야 pause()에서 깨어나 다음문장으로 잘만 가던데, 이건 뭐.. 이유를 모르겠습니다.
시그널 헨들러가 있나요?
SIGALRM, SIGUSR1 시그널의
헨들러가 없다면 디폴트 액션은 프로세스 죽는것 입니다.
시그널 핸들러가 있습니다.
다른 모든건 있고, 단지 pause()가 빠지면 마구 섞이지만 이해가 될정도로는 돌아갑니다.
pause()를 넣으면 child를 불리는 시점에서 죽여버리네요;
댓글 달기