in reply to fork and print..

I just ran your code with some arbitrary commands in @commands and it works fine. So the problem is with the code that you cut out before you posted, not with what's here.

If you post the other routine we will be able to help you to debug that too.

Update: I'm running perl5 (revision 5.0 version 6 subversion 0)

____________________
Jeremy
I didn't believe in evil until I dated it.

Replies are listed 'Best First'.
Re: Re: fork and print..
by Anonymous Monk on May 17, 2001 at 09:31 UTC
    hmmmm.... curiouser and curiouser...

    I just did the same thing as jepri and it still DIDNT work!!????

    This suggests to me that something about my installation is broken - I am running Perl version 5.004_04 built for sun4-solaris on SunOS 5.6 - Does anyone know what could cause a problem like this with this config?

    just in case here is the exact code I ran and the results:

    open(MFOUT,">mfout.txt"); while (<STDIN>) { print MFOUT $_; print $_; } my @commands = ("ls","ls *","cat a","cat x"); my %running = (); my $max_jobs = 200; my $job_count = 0; while ( @commands || %running ) { if ( @commands && ($job_count < $max_jobs)) { my $command = shift(@commands); my $pid; if ($pid = fork) { print "Parent Pid $$\n"; $running{$pid} = $command; ++$job_count; } else { die "cannot fork: $!" unless defined $pid; print "Child Pid $$ $command\n"; my $rc = system $command; exit($rc>>8); } } else { my $child_pid = wait(); if (! exists $running{$child_pid}) { warn "Reaped unkown process id $child_pid!!"; } elsif ($?) { my $rc = $? >> 8; warn "Process '$child_pid:$running{$child_pid}' errored with retu ++rn code ' $rc'"; } print "command '$running{$child_pid}' completed\n"; delete $running{$child_pid}; --$job_count; } }
    when I ran this with input:
    line1
    line2
    line3
    line4

    I got the same output on STDOUT, but mfout.txt contained:
    line1
    line2
    line3
    line4
    line1
    line2
    line3
    line4
    line1
    line2
    line3
    line4
    line1
    line2
    line3
    line4
    line1
    line2
    line3
    line4
      woops - forgot to log in - that anonymous monk above is me :)
        Tell me what happens when you run this:

        open(MFOUT,">mfout.txt"); my @commands= ( 'echo "Hello1"', 'echo "Hello2"', 'echo "Hello3"', 'echo "Hello4"', 'echo "Hello5"', ); my %running = (); my $max_jobs = 2; my $job_count = 0; while ( @commands || %running ) { if ( @commands && ($job_count < $max_jobs)) { my $command = shift(@commands); my $pid; if ($pid = fork) { print "Parent Pid $$\n"; $running{$pid} = $command; ++$job_count; } else { die "cannot fork: $!" unless defined $pid; print "Child Pid $$ $command\n"; print MFOUT `$command`; my $rc = system $command; exit($rc>>8); } } else { my $child_pid = wait(); if (! exists $running{$child_pid}) { warn "Reaped unkown process id $child_pid!!"; } elsif ($?) { my $rc = $? >> 8; warn "Process '$child_pid:$running{$child_pid}' errored with retu +rn code '$ rc'"; } print "command '$running{$child_pid}' completed\n"; delete $running{$child_pid}; --$job_count; } } print "The end!\n"; print MFOUT "The end!\n";

        ____________________
        Jeremy
        I didn't believe in evil until I dated it.