No zombies anymore.
authorHeiko Schlittermann <hs@schlittermann.de>
Wed, 28 Jan 2009 18:57:03 +0100
changeset 8 b3cf6e84d2c6
parent 6 d63acb8bbdbd
child 9 9166982f8b19
child 10 c1a7ff398af1
No zombies anymore.
hlog
--- a/hlog	Tue Jan 27 23:47:51 2009 +0100
+++ b/hlog	Wed Jan 28 18:57:03 2009 +0100
@@ -23,6 +23,7 @@
 use Getopt::Long;
 use IO::Socket::INET;
 use Pod::Usage;
+use POSIX qw(:sys_wait_h);
 
 my $opt_addr  = "0.0.0.0";
 my $opt_port  = 8080;
@@ -58,8 +59,17 @@
         ReuseAddr => 1,
     ) or die "Can't create listener socket: $!\n";
 
-    warn "listener $opt_addr:$opt_port\n";
-    while (my $client = $listener->accept) {
+    $SIG{CHLD} = sub {
+	while ((my $pid = waitpid(-1, WNOHANG)) > 0) { 
+	    print LOG localtime() . " child $pid died\n";
+	}
+    };
+
+    warn "listener $$ $opt_addr:$opt_port\n";
+
+    while (1) {
+	my $client = $listener->accept;
+	next if not defined $client;	# may be because of signal
 
         print LOG $_ =
             localtime()
@@ -72,6 +82,7 @@
         my $pid = fork();
         die "Can't fork: $!\n" if not defined $pid;
         if ($pid == 0) {
+	    $SIG{CHLD} = "DEFAULT";
             $listener->close;
             handle_request($client);
             exit 0;