kill PIPE => $$;
kill PIPE => $pid;
kill TERM => $pid;
die 'Test Death';
####
#!/usr/bin/env perl -l
use strict;
use warnings;
use Capture::Tiny qw{capture};
use Try::Tiny;
my $retvals_for;
{
my ($stdout, $stderr, $exit);
try {
($stdout, $stderr, $exit) = capture \&run_external_command;
}
catch {
die "FATAL! $_" if defined $_;
}
finally {
print_results($stdout, $stderr, $exit);
};
die "ERROR! External command failed.\n" unless $exit;
}
sub run_external_command {
my $external_command = 'cat';
push @{$retvals_for->{command}}, $external_command;
{
my $cmd_pipe;
push @{$retvals_for->{signal}}, 'SIGPIPE not received.';
local $SIG{PIPE} = sub {
pop @{$retvals_for->{signal}};
push @{$retvals_for->{signal}}, 'SIGPIPE received.', @_;
if (exists $retvals_for->{open} and $retvals_for->{open}[0]) {
kill TERM => $retvals_for->{open}[0]
if kill 0 => $retvals_for->{open}[0];
my $close_ok = close $cmd_pipe;
if ($close_ok) {
push @{$retvals_for->{signal}}, "Closed pipe: $close_ok";
}
else {
push @{$retvals_for->{signal}}, "Can't close pipe: $!, $?";
}
}
die 'SIGPIPE received.';
};
my $pid = open $cmd_pipe, '|-', $external_command;
if (defined $pid) {
push @{$retvals_for->{open}}, $pid;
}
else {
push @{$retvals_for->{open}}, "Can't open pipe: $!";
return 0;
}
my $print_ok = print $cmd_pipe "password\n";
if ($print_ok) {
push @{$retvals_for->{print}}, $print_ok;
}
else {
push @{$retvals_for->{print}}, "Can't print pipe: $!";
return 0;
}
my $close_ok = close $cmd_pipe;
if ($close_ok) {
push @{$retvals_for->{close}}, $close_ok;
}
else {
push @{$retvals_for->{close}}, "Can't close pipe: $!, $?";
return 0;
}
}
return 1;
}
sub print_results {
my ($stdout, $stderr, $exit) = @_;
print 'STDOUT:';
print defined $stdout ? $stdout : '';
print 'STDERR:';
print defined $stderr ? $stderr : '';
print 'EXIT:';
print defined $exit ? $exit : '';
print 'Return Values';
for my $source (qw{command open print close signal}) {
print ucfirst($source), ':';
print for @{$retvals_for->{$source}};
}
}
####
STDOUT:
password
STDERR:
EXIT:
1
Return Values
Command:
cat
Open:
5906
Print:
1
Close:
1
Signal:
SIGPIPE not received.