Вам придется что-то изменить, изменить код для использования fork, возможно, проще, но если вы абсолютно не настроены против использования fork, вы можете использовать сценарий оболочки-оболочки, который касается файла, когда это будет сделано, и затем иметь ваш Perl-код проверяет наличие файлов.
Вот обертка:
#!/bin/bash
$*
touch /tmp/$2.$PPID
Ваш Perl-код будет выглядеть так:
for my $p (@a){
system("/path/to/wrapper.sh /path/to/file.sh $p &");
}
while (@a) {
delete $a[0] if -f "/tmp/$a[0].$$";
}
Но я думаю, что код разветвления безопаснее и яснее:
my @pids;
for my $p (@a) {
die "could not fork" unless defined(my $pid = fork);\
unless ($pid) { #child execs
exec "/path/to/file.sh", $p;
die "exec of file.sh failed";
}
push @pids, $pid; #parent stores children's pids
}
#wait for all children to finish
for my $pid (@pids) {
waitpid $pid, 0;
}