Захватите возвращаемое значение вызова fork, чтобы получить идентификатор процесса дочернего процесса.
my $pid = fork();
if ($pid == 0) { # child
system("command > logfile");
exit 0;
}
# else parent
do {
# ... apply File::Tail to logfile, print new output ...
while (process_is_active($pid));
Тогда есть много способов узнать, когда ребенок закончил. Вот два:
# 1. kill 0, $pid
sub process_is_active {
my ($pid) = @_;
return kill 0, $pid; # returns "number of processes successfully signalled"
}
В некоторых системах реализована kill 0,...
лучше, чем в других.
# 2. non-blocking waitpid
sub process_is_active {
use POSIX ':sys_wait_h';
my ($pid) = @_;
my $waitpid = waitpid $pid, WNOHANG;
return $waitpid == $pid;
}
Второе решение будет работать только один раз - после того, как waitpid
обнаружит, что процесс завершен и пожнет его, он вернет -1
, если вы вызовете его снова в этом процессе.