Forked counter process



examples/forks/ForkedCounter.pm
package ForkedCounter;
use strict;
use warnings;
use Task;


sub counter_one_by_one {
    my ($task_count, $max) = @_;

    for my $fork_id (1 .. $task_count) {
        my $pid = fork();
        die "Could not fork" if not defined $pid;
        if (not $pid) {
            Task::count($max);
            exit;
        }
    }
    for my $fork_id (1 .. $task_count) {
        wait();
    }
}


sub counter {
    my ($fork_count, $task_count, $max) = @_;

    my @tasks;
    push @tasks, 1+int($task_count/$fork_count) for 1 .. ($task_count % $fork_count);
    push @tasks, int($task_count/$fork_count) for 1 .. ($fork_count - ($task_count % $fork_count));
    print "@tasks\n";
    for my $fork_id (1 .. $fork_count) {
        my $pid = fork();
        die "Could not fork" if not defined $pid;
        if (not $pid) {
            #print "PID $pid $tasks[$fork_id-1]\n";
            for my $i (1..$tasks[$fork_id-1]) {
                Task::count($max);
            }
            exit;
        }
    }
    for my $fork_id (1 .. $fork_count) {
        wait();
    }
}

1;