<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">news.utdallas.edu!tamsun.tamu.edu!cs.utexas.edu!uwm.edu!caen!uvaarpa!mmdf Mon Mar 22 16:04:47 CST 1993
Article: 1639 of comp.lang.perl
Xref: feenix.metronet.com comp.lang.perl:1639
Newsgroups: comp.lang.perl
Path: feenix.metronet.com!news.utdallas.edu!tamsun.tamu.edu!cs.utexas.edu!uwm.edu!caen!uvaarpa!mmdf
From: "Joshua R. Poulson" &lt;jrp@netman.widener.edu&gt;
#Subject: server.pl and defunct child processes
Message-ID: &lt;1993Mar17.143026.21961@uvaarpa.Virginia.EDU&gt;
Sender: mmdf@uvaarpa.Virginia.EDU (Mail System)
Reply-To: jrp@netman.widener.edu
Organization: The Internet
Date: Wed, 17 Mar 1993 14:30:26 GMT
Lines: 75

Hello folks...

Earlier I asked about &lt;defunct&gt; processes and the server.pl in the Camel
book. Thanks to a hint from Erik E. Rantapaa, I have a nicely working
server.pl than no longer has this "daycare problem." (What else would
you call child management?)

Without too much verbiage, here is my new server.pl:

#!/usr/local/bin/perl

require '/usr/new/lib/perl/sys/socket.ph';
require '/usr/new/lib/perl/sys/errno.ph';
require '/usr/new/lib/perl/sys/wait.ph';

($port) = @ARGV;
$port = 2345 unless $port;
print "Port = $port\n";

($name, $aliases, $proto) = getprotobyname('tcp');
if ($port !~ /^\d+$/) {
    ($name, $aliases, $port) = getservbyport($port, 'tcp');
}

$sockaddr = 'S n a4 x8';
$this = pack($sockaddr, &amp;AF_INET, $port, "\0\0\0\0");
select(NS); $| = 1; select(STDOUT);
socket(S, &amp;AF_INET, &amp;SOCK_STREAM, $proto) || die "socket: $!";
print "socket ok\n";
bind(S, $this) || die "bind: $!";
print "bind ok\n";
listen(S, 5) || die "connect: $!";
print "listen ok\n";
select(S); $| = 1; select(STDOUT);

print "Server process master is $$\n";

for ($con = 1; ; $con++) {
    print "Listening for connect ", $con, "...\n";
    if ($addr = accept(NS, S)) {
	print "accept ok\n";
	if ($child = fork) {
	    print "$$: waiting for $child\n";
	    waitpid($child, 0);
	    print "$$: $child reaped\n";
	} else {
	    if (fork) {
		print "$$: phantom\n";
		exit;
	    } else {
		print "Child $$ forked.\n";
		print "Accepted a connection from ";
		($af, $port, $inetaddr) = unpack($sockaddr, $addr);
		@inetaddr = unpack('C4', $inetaddr);
		($name, $aliases, $addrtype, $length, @addrs) = 
		    gethostbyaddr($inetaddr, &amp;AF_INET);
		$inetaddr = join('.', @inetaddr);
		print "$name ($inetaddr) on port $port.\n";
		while(&lt;NS&gt;) {
		    print "$con: $_";
		    print NS "You said: ", $_;
		}
		print NS "Connection $con closed.\n";
		print "Connection $con closed.\n";
		close(NS); 
		print "Child $$ exited.\n";
		exit;
	    }
	}
    } else {		      
	warn "accept: $!";
    }
}

Thanks to all who responded! --JRP


</pre></body></html>