Search code examples
perlfork

How to use fork() in Perl?


I have hundreds of file names in an array. I want to create a child process for every 4 files in the array, and have that child do some stuff to each of those 4 files. (So with 100 files, I'll create 25 processes.)

I'm having some trouble understanding the order in which lines are processed when there's a fork. I was thinking I could do something like this, but I'm getting stuck:

foreach $file (@files) {
 if ($f++ % 4 == 0) {
  my $pid = fork();

  if ($pid) {
   push(@childs, $pid);
  }
  elsif ($pid == 0) {
    ... do stuff to $file ...
  }
 }

I don't think this is right, and I'm hoping someone can point me in the right direction. Thanks.


Solution

  • In addition to your trouble using fork, you also seem to have trouble partitioning your @files array into smaller sets of four files. Maybe something like this:

    for (my $i = 0; $i < @files; $i += 4) {
    
        # take a slice of 4 elements from @files
        my @files4 = @files[$i .. $i + 3];
    
        # do something with them in a child process
        if (fork() == 0) {
            ... do something with @files4 ...
            exit;   # <--- this is very important
        }
    }
    
    # wait for the child processes to finish
    wait for 0 .. @files/4;