kill TERM => $pid;
Correction! It's much simpler than that. Closing the handle will close the pipe, which will result in the child killing itself (SIGPIPE) the next time it attempts to write to it.
Since closing the handle also waits for the child to end, kill can still come in useful if the child only writes to the handle sporadically.
my $pid = open(my $fr_chld, '-|', $^X, -le => '$|=1; { print ++$i; sleep 1; redo; }' ); print scalar <$fr_chld> for 1..4; #kill TERM => $pid; close($fr_chld); if ($? & 127) { require Config; my @sig_names = split ' ', $Config::Config{sig_name}; print("Child died from SIG$sig_names[$? & 127]\n"); } elsif ($? >> 8) { print("Child exited with error ", ($? >> 8), "\n"); } else { print("Child exited successfully\n"); }
1 2 3 4 Child died from SIGPIPE
That brings up another advantage of open '-|' over backticks: You can use the multi-argument form to avoid invoking the shell.
Update: Added correction.
In reply to Re: pipes: killing the child?
by ikegami
in thread pipes: killing the child?
by 7stud
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |