By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
426,179 Members | 2,192 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 426,179 IT Pros & Developers. It's quick & easy.

fork in perl 5.8.3 on windows

P: n/a
I am trying to write a simple file transfer server in perl that will
reside of both windows and linux platforms. Basically, it accepts a
connection, forks a process, and then should close the child. on
windows, it dies after "accumulating" 64 children opened - however,
they should all (or most) have exited by that time. Any idea how to
get my children to exit and free up space for more connections?

Thanks - Josh

here's the relevant part of my code:
sub reaper { #to eliminate dead child processess
$waitpid=wait;
$SIG{CHLD}=\&reaper;
}
$SIG{CHLD}=\&reaper;

main();

sub main {
my $contentlength;

print "Loading data transfer server on port
$datatransfer_port...\n\n";
socket_listen (\*SERVER, $datatransfer_port);
while (accept ($client, SERVER)) {
my ($c_port, $c_iaddr) = sockaddr_in(getpeername($client));
my(@inetaddr) = unpack('C4', $c_iaddr);
my $from = join('.', @inetaddr);

if (my $pid = fork) { #if it is the server, then next
close $client or die "Client socket close failed: $!";
} elsif (defined $pid) { #a child
client_connect($client, $from); #processes the clients connection
exit(0);
} else {
die "fork error: $!"; #program dies here after 64
client_connect's
}
}
}
Jul 19 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
jo********@vanderbilt.edu (Josh Denny) wrote in message news:<a3**************************@posting.google. com>...
windows, it dies after "accumulating" 64 children opened - however,
they should all (or most) have exited by that time. Any idea how to
get my children to exit and free up space for more connections?

This is probably not necessary - if the parent doesn't CARE when the
child dies, you ought to just be able to say:
$SIG{CHLD} = 'IGNORE';
sub reaper { #to eliminate dead child processess
$waitpid=wait;
$SIG{CHLD}=\&reaper;
}
$SIG{CHLD}=\&reaper;
Take a look at client_connect and see why client_connect is hanging. while (accept ($client, SERVER)) {
my ($c_port, $c_iaddr) = sockaddr_in(getpeername($client));
my(@inetaddr) = unpack('C4', $c_iaddr);
my $from = join('.', @inetaddr);

if (my $pid = fork) { #if it is the server, then next
close $client or die "Client socket close failed: $!";
} elsif (defined $pid) { #a child
client_connect($client, $from); #processes the clients connection
exit(0);
} else {
die "fork error: $!"; #program dies here after 64
client_connect's
}
}
}

Jul 19 '05 #2

P: n/a
In article <a3**************************@posting.google.com >, Josh
Denny <jo********@vanderbilt.edu> wrote:
I am trying to write a simple file transfer server in perl that will
reside of both windows and linux platforms. Basically, it accepts a
connection, forks a process, and then should close the child. on
windows, it dies after "accumulating" 64 children opened - however,
they should all (or most) have exited by that time. Any idea how to
get my children to exit and free up space for more connections?

Thanks - Josh

here's the relevant part of my code:
sub reaper { #to eliminate dead child processess
$waitpid=wait;
$SIG{CHLD}=\&reaper;
}
$SIG{CHLD}=\&reaper;

main();

sub main {
my $contentlength;

print "Loading data transfer server on port
$datatransfer_port...\n\n";
socket_listen (\*SERVER, $datatransfer_port);
while (accept ($client, SERVER)) {
my ($c_port, $c_iaddr) = sockaddr_in(getpeername($client));
my(@inetaddr) = unpack('C4', $c_iaddr);
my $from = join('.', @inetaddr);

if (my $pid = fork) { #if it is the server, then next
close $client or die "Client socket close failed: $!";
} elsif (defined $pid) { #a child
client_connect($client, $from); #processes the clients connection
exit(0);
} else {
die "fork error: $!"; #program dies here after 64
client_connect's
}
}
}


My guess is that the client_connect routine is hanging up and not
returning, but without seeing the code it is really hard to tell. Print
out the PIDs in the parent and print the PID ($$) from the child just
before the exit(0) statement to tell for sure.

You might want to check out socket modules: Socket or IO::Socket.
Jul 19 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.