fork in perl 5.8.3 on windows

Discussion in 'Perl' started by Josh Denny, Mar 2, 2004.

  1. Josh Denny

    Josh Denny Guest

    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
    }
    }
    }
     
    Josh Denny, Mar 2, 2004
    #1
    1. Advertising

  2. (Josh Denny) wrote in message news:<>...
    > 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
    > }
    > }
    > }
     
    Will Stranathan, Mar 2, 2004
    #2
    1. Advertising

  3. Josh Denny

    Jim Gibson Guest

    In article <>, Josh
    Denny <> 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.
     
    Jim Gibson, Mar 2, 2004
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Andrew Zhilenko
    Replies:
    0
    Views:
    796
    Andrew Zhilenko
    Nov 22, 2004
  2. Eric Snow

    os.fork and pty.fork

    Eric Snow, Jan 8, 2009, in forum: Python
    Replies:
    0
    Views:
    574
    Eric Snow
    Jan 8, 2009
  3. Kelly Corcam

    Emacs debugger and perl fork

    Kelly Corcam, Aug 22, 2003, in forum: Perl Misc
    Replies:
    1
    Views:
    143
    Peter Scott
    Aug 23, 2003
  4. debraj

    query on fork in perl

    debraj, May 25, 2004, in forum: Perl Misc
    Replies:
    3
    Views:
    110
    Brian McCauley
    May 25, 2004
  5. Replies:
    4
    Views:
    1,014
    JTech
    Nov 29, 2005
Loading...

Share This Page