in reply to pipes: killing the child?
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.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: pipes: killing the child?
by 7stud (Deacon) on Jan 21, 2010 at 10:25 UTC | |
by rubasov (Friar) on Jan 21, 2010 at 11:23 UTC | |
by ikegami (Patriarch) on Jan 21, 2010 at 16:17 UTC | |
|
Re^2: pipes: killing the child?
by 7stud (Deacon) on Jan 22, 2010 at 08:30 UTC | |
by ikegami (Patriarch) on Jan 22, 2010 at 10:32 UTC | |
by Anonymous Monk on Jan 22, 2010 at 09:05 UTC |