Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I need to fork child process for each array element. I'm using below code :

#!/usr/bin/env perl my $pid; my @a = (1,2,3); for my $i (@a) { print "i -> $i \n"; $pid = fork(); if ( $pid ) { # parent print " child pid : $pid \n"; } elsif ( $pid == 0) { #child #print "child working on $i "; } } while((wait()) > 0) {}; exit

but executing the code results in child processes more than the no. of elements in array. I don't know what's the problem. Output look like : i -> 1 child pid : 12629 i -> 2 i -> 2 child pid : 12631 i -> 3 child pid : 12630 i -> 3 child pid : 12632 i -> 3 child pid : 12633 i -> 3 child pid : 12634 child pid : 12635

Replies are listed 'Best First'.
Re: fork child process
by Corion (Patriarch) on Apr 14, 2015 at 08:23 UTC

    Your forked children continue the loop. Most likely, you don't want to do that. Either use exit when your child completed its work or use a wrapper like Parallel::ForkManager, which provides idioms that make working with forked children easier.

Re: fork child process
by hippo (Archbishop) on Apr 14, 2015 at 08:22 UTC

    Both the children and the parents are inside the loop.

Re: fork child process
by jeffa (Bishop) on Apr 14, 2015 at 16:44 UTC

    As others have already pointed out, you need to explicitly call exit in the portion that will be executed by the child processes. In other words, try something a bit more like this:

    #!/usr/bin/env perl use strict; use warnings; my @a = (1,2,3); for my $i (@a) { my $pid = fork(); if ( $pid == 0 ) { print "$i -> i am a forked child\n"; exit; } else { print "$i -> forking $pid\n"; } } while((wait()) > 0) {};

    See perlfork and perlipc for more examples.

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)