This is probably a POSIX-only feature, but I might be wrong - you probably won't see signals at all on other systems. If you do happen to be in a Unixy environment -- Linux, Solaris, *BSD, et al. -- the following should probably do what you want:
#!/usr/bin/perl
use POSIX qw{:signal_h};
if (system('for a in 1 2 3 4; do echo $a>>/tmp/foobar; echo tick $a; s
+leep 5; done')
!= 0)
{
my $sig_if_any = $? & 127;
my $return_value = $? >> 8;
print "child died: rv=$return_value, signal=$sig_if_any\n";
if (defined($sig_if_any) && ($sig_if_any == SIGINT))
{
print "child was interrupted\n";
# ... do something appropriate ...
}
# ... cleanup ...
}
else
{
# ... do something with /tmp/foobar
}
## ... run, and hit ctrl-c while it ticks...
The usual caveats about interpolating Perl variables into the strings passed to system() apply, of course :). Any monks more cross-platformy than me care to comment on the applicability of $? on other systems?