From: Harald K. <ch...@po...> - 2002-02-21 18:45:29
|
> My mh produces about two zombie processes everytime i reload/refresh a mh > produced web page. This problem does not seem to happen with the photo > frame code however. Generally speaking, one of two things has to happen: 1) If $SIG{CHLD} = "IGNORE" will automatically reap all children. 2) MH must call wait() or waitpid() to reap each child process. This is usually handled by installing a signal handler. It looks like, at startup, A signal handler is installed for CHLD, which reaps the process (except on FreeBSD for some reason). However, the code isn't quite right. UNIX does not signal once for each event; multiple signals are collapsed into a single signal handler call. The current signal handler reaps one child then returns; if multiple children exited before the signal handler triggered, the rest will be left behind. The perlfunc man page documents this 'standard' loop: use POSIX ":sys_wait_h"; #... do { $kid = waitpid(-1,&WNOHANG); } until $kid == -1; (The WNOHANG is necessary to prevent a blocking wait :-) I also found at least one place in the code where SIGCHLD is reset to IGNORE (in Voice_Text.pm), which would make the problem completely disappear and may be why most of us don't see it. As always, Bruce is the expert :-) -- Harald Koch <ch...@po...> |