Hi all,

Again, I drown in the muddy watters of child processes:

What I want to achieve is: spawn up to $max_child processes and setup pipes in such 
away that all child processes can 'print' to the parent. This because I want to inform 
the parent about the exit value of the process
(I know I can set up a signal handler for that, but I have found them very unreliable, 
so I want to trry it using pipes)

My output is not what I expected :( Can somebody help me??

This is the code:

#!/bin/env perl
#

use strict;
use FileHandle;

# Global variables;
my $child = 0;
my $max_child = 4;

sub SpawnChild
{
        my ($no, $child) = @_;

        pipe(READ, WRITE);
        autoflush WRITE 1;
        
        # Fork a new child process
        my $pid = fork();
        if ($pid) {
                # This is the parent process
                close(WRITE);   
                return;
        }
        else {  # this is the child
                close(READ);
          
                my $sleep = int(rand(6)+1); # a no use random work load
                sleep($sleep);
                print WRITE "End $no Slept $sleep\n";
                exit;           
        }
}


sub Parent 
{
        my ($max_iterations) = @_;
        
        for (my $i = 1; $i < $max_iterations; $i++) {
                $child++;

                print STDOUT "Spawn $i $child\n";
                SpawnChild($i, $child);
                
                while ($child >= $max_child) {
                        my $input = <READ>;
                        print STDOUT $input;
                        $child--;
                }                                       
        }
        for (my $i = 1; $i < $max_child; $i++) {
                my $input = <READ>;
                print STDOUT $input;
                $child--;
        }
}

This is my output:

Spawn 1 1
Spawn 2 2
Spawn 3 3
Spawn 4 4
End 4 Slept 6
Spawn 5 4
End 5 Slept 2
Spawn 6 4
End 6 Slept 1
Spawn 7 4
End 7 Slept 1
Spawn 8 4
End 8 Slept 2
Spawn 9 4
End 9 Slept 5

So I miss something like
End 1 Slept 6
End 2 Slept 3
End 3 Slept 2
End 4 Slept 4

Where did the 'return print' for the first 4 children go????

Thanks for any suggestions

Jeroen Lodewijks



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to