#! /usr/bin/perl -w use 5.008; use strict; use IO::Select; # program and args my @work = qw(sleep 3); my $wanted = 2; my $s = IO::Select->new; my $have = 0; while ($wanted) { while ($have < $wanted) { open(my $fh, "|-", @work) || die "Could not fork: $!"; $s->add($fh); $have++; } for ($s->can_read()) { $s->remove($_); $have--; close $_; die "Unexpected returncode $?" if $?; # Real code may change $wanted here } }