child로 오는 시그널 처리하기..
글쓴이: felucca / 작성시간: 화, 2003/11/18 - 9:52오후
1. fork하여 생긴 child의 경우에
parent에서 signal()로 정의한 시그널 핸들러도 상속하나요?
2. 상속한다면,
fork하여 생긴 child에서 execev를 이용하여 다른 프로그램을
띄운 후에도 그 시그널 핸들러는 유효한가요?
3. 유효하지 않다면,
그 새 프로그램을 돌리는 프로세스에 시그널이 갔을 때, 기존 부모
process에 대해서 어떤 처리를 해 주려면 어떻게 해야 할까요?
간단한 쉘을 짜고 있는데요,
위처럼 child process를 fork하여 프로그램을 돌리는 경우에
ctrl-z나 ctrl-c 같은 경우는 shell자체에 시그널이 와서 handler를
써서 child에 적당한 시그널을 주고 하는 식으로 구현했는데
다짜고짜 kill()을 써서 fork해 돌아가고 있는 child process에 직접
시그널을 줘 버리면.. 이걸 어떻게 처리해야 하는지..
쉘은 foreground로 위 프로그램을 돌리느라 기다리고만 있는데요..
너무 naive하게 구현한 것 같기도 하고.. ㅡㅡ;
/*shell에서 foreground로 돌렸을 때 child가 죽을때까지 기다리는 part.*/
void waitfg(pid_t pid) { struct job_t *fg; // 따로 job list(jobs)를 관리하고 있음 fg = getjobpid(jobs, pid); /*job이 실행을 마쳐 없어지거나 (fg ==NULL) joblist에서 state가 ST(stop)으로 바뀌면 무한루프를 빠져나가 다시 prompt를 보임*/ while(fg != NULL && fg->state != ST) { sleep(1); fg = getjobpid(jobs, pid); } }
Forums:
signal handler는 user memory에 있기 때문에 fork
signal handler는 user memory에 있기 때문에 fork할때 그대로 복사됩니다. 따라서, signal handler는 유지 됩니다.
그러나 exec 계열을 사용하면 user memory가 모두 새로운 process를 위해 초기화 되기 때문에, signal handler는 유효하지 않게 됩니다.
3 번의 경우 답이 없습니다. child가 어떤 signal 을 받았을 경우 child의 상태가 변하는 즉, 죽는다든지, STOP된다든지 CONTINUE한다든지의 변화 외에는 알 방법이 없습니다. 위의 변화는 모두 SIGCHLD로 넘어오게 됩니다.
---
http://coolengineer.com
댓글 달기