The problem is the order in which the handle's destructor and the END block are executed. If the file handle is destroyed first, you have a problem. When destroying a file handle, perl closes it, and closing a file handle opened with open '...|' causes perl to wait until the child process exits. Seeing as the kill command hasn't been executed, that won't happen.
You don't have that problem with open3 since you control when waitpid is called.
use IPC::Open3 qw( open3 ); my @tail_pids; END { for my $tail_pid (@tail_pids) { kill TERM => $tail_pid; waitpid($tail_pid, 0); } } sub start_tail { my ($mw, $file) = @_; my ($from_tail, $tail_err); push @tail_pids, open3(undef, $from_tail, $tail_err, qw( tail -1lf +), $file); $mw->fileevent($from_tail, 'readable' => [ \&input_from_tail, $mw, +$file ]); $mw->fileevent($tail_err, 'readable' => [ \&sink, $mw, +$file ]); }
Notes:
In reply to Re^3: Getting a Perl program to close a command it starts when the perl program exits?
by ikegami
in thread Getting a Perl program to close a command it starts when the perl program exits?
by buzzthebuzzsaw
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |