CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): lunaris (+가짜집시+)
날 짜 (Date): 2002년 4월 23일 화요일 오후 02시 13분 16초
제 목(Title): sigchld 질문 



  간단한 데몬을 돌리고 있습니다. 이놈은 child process 들을 여러개 두고 각자
일을 하도록 만드는데, 외부에서 QUIT signal 이 들어오면 child 들에게 '비상사
태'를 선언하는 별도의 메시지를 날리게 되고, child 들은 메시지를 받고 하던일
의 뒷처리를 한 뒤 (뒷처리가 매우 중요해서 그냥 죽이면 안됩니다) 종료합니다. 
이때 SIGCHLD 가 날아오므로 parent 는 sigchld의 handler 안에서 wait() 한 뒤, 
반환되는 pid 를 가지고 '죽은 자식 꺼추에 도장찍기' 를 합니다. 모든 자식에 
도장이 찍혔으면 자신도 종료합니다. 

  여기까진 그럴싸한데, 이 도장찍어주는 handler function이 자식 수만큼 불리지
가 않는 것 같습니다. syslog 로 로그를 남겨보면 자식이 10마리일때 적게는 2번, 
정도, 가끔 10번이 다 잡힐 때도 있구요. 이게 소문에만 듣던 signal handler에 
의한 함수 재진입 현상이 아닌가 싶은데... 그러니까 signal handling이 다 끝나
기도 전에 다시 signal 이 날아와서 handler 가 본의아니가 multi-thread로 돌게
되는... 뭐 그런걸까 싶습니다. 당연히 global variable 도 건드리고 (child 들
의 pid 와 status, I/O pipe pair 등이 기록된) 이것저것 잡일도 하니 함수 자체
를 re-entrant 하게 짜주는건 어려울 것 같은데...   

  이 경우에 어떻게 짜야하는 건가요? waitpid() 함수로 모든 child 들의 종료를
메시지 하나 하나 날리면서 기다려야 하는 것인지? 보통은 어떻게 해결하나요?
  

 | 모든 물건들 위로 기억들이 투영된다. 가끔 관련 없는 모습들을 비추며 오늘은 |
 | 어제를 산다. 하나 하나의 문장들은 기억의 매듭이다. 오늘의 그대위로 어제의 |
 | 그대가 뿌리를 내린다. 닮았구나 사람이, 산다는 것은.                       |
 |                                          - 가짜집시 <lunaris@neomain.com> |
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.