CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): swhan (foo bar)
날 짜 (Date): 2002년 4월 26일 금요일 오전 12시 00분 54초
제 목(Title): Re: sigchld 질문 


1. 원 문제에서 시작이 아마 이렇겠지요?
   for( ; all child process; )
   { 
    kill( childpid, SIGXXX);
   }
   
   여기에 이거정도면 충분하지 않을까요?
   for( ; all child process; )
   {
   while(1)
   {
   returnValue = waitpid( childpid, &status, 0);
   if( returnValue < 0 && errno == EINTR) continue;
   // returnValue > 0  ==> child exit.
   // returnValue < 0 && errno == ECHILD ==> child not exist
break;
}
   }
// NO Child exit any more ;p

zombie랑. STOP된 child가 아닌 이상 잘 돌아갈겁니다.
STOP된거라면 Operator가 임의로 했을테니까.. SIGCONT를 Operator가 해줘야 
다음으로 진행될꺼고...

2. zombie인 경우까지 꼭 처리를 해야겠다면 waitpid의 옵션에 WNOHANG을 
주고.. continue전에 sleep(1)정도 주면서 3~5번정도 loop돌게 하면 
되겠네요. (시간은 적당하게..- time critical하지 않은거 맞죠? :p )
   그리고 필요에 따라 3번째 for문 추가해서 kill -9 시켜버림 되겠죠. 
   (kill -9의 check는 필요 없겠고...)
   문제는 child의 후처리가 아주 중요하다는건데.... kill -9가 끼면 
후처리를 중단시킬 가능성도 있다는데 문제가 있습니다. 이거 피하려면 
골치좀 아프겠네요. 
   역시..후처리 시작과 끝을 Message Queue나 file log등으로 남겨주면 
process든 Operator든 판단하는데 도움이 되겠군요. shared memory라면 
더 편하겠고...

3. POSIX signal을 주고 받을 수 있다면 queueing이 되니까 좋겠지만...
   SIGCHILD를 그렇게 쓰는건... 흠..
   
4. 이런 종료시가 아닌. 평상시에 child 관리할때는 signal보내봐서 
살아있는지 죽었는지.. 판단하는데..종료처리때면 좀 애매하군요. 문제는 
STOP된 process입니다. SIGCONT와 SIGUSR을 동시에 보내기도 뭐하고.... 
이런 경우에 POSIX signal이라면 queue에 들어가니까.. 큐가 꽉차면 에러를 
내보내줘서 좀 늦게라도 알아챌수가 있긴 하지만 말입니다. 
  가장 확실한건 chlid process의 signal handler가 shared memory에 
write를 해서 parent process가 check해주는건데.. 주변이 좀 
복잡해지는군요...

 
점점 얘기가 산으로 가고 있어서 저는 이만 줄여야겠군요.. :)
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.