| [ 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해주는건데.. 주변이 좀 복잡해지는군요... 점점 얘기가 산으로 가고 있어서 저는 이만 줄여야겠군요.. :) |