[merged] (zombie killer) multi
authorHeiko Schlittermann <hs@schlittermann.de>
Wed, 28 Jan 2009 18:57:56 +0100
branchmulti
changeset 9 9166982f8b19
parent 7 83dad3fbc95e (current diff)
parent 8 b3cf6e84d2c6 (diff)
child 16 ce482bda336e
[merged] (zombie killer)
hlog
--- a/hlog	Wed Jan 28 06:23:51 2009 +0100
+++ b/hlog	Wed Jan 28 18:57:56 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;
@@ -60,8 +61,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()
@@ -74,6 +84,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;