fork in perl 5.8.3 on windows

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Josh Denny

    fork in perl 5.8.3 on windows

    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 "accumulati ng" 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}=\&re aper;
    }
    $SIG{CHLD}=\&re aper;

    main();

    sub main {
    my $contentlength;

    print "Loading data transfer server on port
    $datatransfer_p ort...\n\n";
    socket_listen (\*SERVER, $datatransfer_p ort);
    while (accept ($client, SERVER)) {
    my ($c_port, $c_iaddr) = sockaddr_in(get peername($clien t));
    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
    }
    }
    }
  • Will Stranathan

    #2
    Re: fork in perl 5.8.3 on windows

    josh.denny@vand erbilt.edu (Josh Denny) wrote in message news:<a3123321. 0403011830.2f82 de6d@posting.go ogle.com>...[color=blue]
    > windows, it dies after "accumulati ng" 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?
    >[/color]

    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';
    [color=blue]
    > sub reaper { #to eliminate dead child processess
    > $waitpid=wait;
    > $SIG{CHLD}=\&re aper;
    > }
    > $SIG{CHLD}=\&re aper;[/color]

    Take a look at client_connect and see why client_connect is hanging.[color=blue]
    > while (accept ($client, SERVER)) {
    > my ($c_port, $c_iaddr) = sockaddr_in(get peername($clien t));
    > 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
    > }
    > }
    > }[/color]

    Comment

    • Jim Gibson

      #3
      Re: fork in perl 5.8.3 on windows

      In article <a3123321.04030 11830.2f82de6d@ posting.google. com>, Josh
      Denny <josh.denny@van derbilt.edu> wrote:
      [color=blue]
      > 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 "accumulati ng" 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}=\&re aper;
      > }
      > $SIG{CHLD}=\&re aper;
      >
      > main();
      >
      > sub main {
      > my $contentlength;
      >
      > print "Loading data transfer server on port
      > $datatransfer_p ort...\n\n";
      > socket_listen (\*SERVER, $datatransfer_p ort);
      > while (accept ($client, SERVER)) {
      > my ($c_port, $c_iaddr) = sockaddr_in(get peername($clien t));
      > 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
      > }
      > }
      > }[/color]

      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.

      Comment

      Working...