| [ 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> | |