use strict;
use warnings;
my $file = 'reqtest.pl';
my $fh;
open $fh, ">$file" or die "Can't create file '$file': $!: $^E\n";
print $fh <<'EOT';
BEGIN {
print STDERR "Hit CTRL+C now!\n";
sleep 3;
}
1;
EOT
close $fh;
unshift @INC, sub {
my($coderef, $filename) = @_;
return unless $filename eq $file;
open $fh, $filename or die "Can't read file '$file': $!: $^E\n";
return $fh;
};
$SIG{INT} = sub {
print "Caught SIGINT. Terminating.\n";
if (defined fileno $fh) {
close $fh or warn "Can't close fh: $!: $^E\n";
}
else {
print STDERR "fh is already closed\n";
}
if (-f $file) {
unlink $file or warn "Can't delete file '$file': $!: $^E\n";
}
else {
print STDERR "file is already deleted (!)\n";
}
exit;
};
require $file or die "require() failed\n";
unlink $file or die "Can't delete file '$file': $!: $^E\n";
####
use strict;
use warnings;
my $file = 'reqtest.pl';
my $fh;
open $fh, ">$file" or die "Can't create file '$file': $!: $^E\n";
print $fh "1;\n";
close $fh;
my $sub = sub {
open $fh, $file or die "Can't open $file: $!: $^E\n";
print STDERR "Hit CTRL+C now!\n";
sleep 3;
};
$SIG{INT} = sub {
print "Caught SIGINT. Terminating.\n";
if (defined fileno $fh) {
close $fh or warn "Can't close fh: $!: $^E\n";
}
else {
print STDERR "fh is already closed\n";
}
if (-f $file) {
unlink $file or warn "Can't delete file '$file': $!: $^E\n";
}
else {
print STDERR "file is already deleted (!)\n";
}
exit;
};
$sub->();
unlink $file or die "Can't delete file '$file': $!: $^E\n";
####
use strict;
use warnings;
BEGIN {
if ($^O =~ /MSWin32/io) {
require Win32API::File;
Win32API::File->import(qw(GetOsFHandle CloseHandle));
}
else {
no strict 'refs';
*{GetOsFHandle} = sub {
use strict 'refs';
return fileno $_[0];
};
*{CloseHandle} = sub {
use strict 'refs';
open my $fh, '<&' . $_[0] or return;
return close $fh;
};
}
}
my $file = 'reqtest.pl';
my $osfh;
open my $fh, ">$file" or die "Can't create file '$file': $!: $^E\n";
print $fh <<'EOT';
BEGIN {
print STDERR "Hit CTRL+C now!\n";
sleep 3;
}
1;
EOT
close $fh;
unshift @INC, sub {
my($coderef, $filename) = @_;
return unless $filename eq $file;
open my $fh2, $filename or die "Can't read file '$file': $!: $^E\n";
$osfh = GetOsFHandle($fh2);
return $fh2;
};
$SIG{INT} = sub {
print STDERR "Caught SIGINT. Terminating.\n";
if (defined $osfh) {
CloseHandle($osfh) or warn "Can't close osfh: $!: $^E\n";
}
else {
print STDERR "osfh is already closed\n";
}
if (-f $file) {
unlink $file or warn "Can't delete file '$file': $!: $^E\n";
}
else {
print STDERR "file is already deleted (!)\n";
}
exit;
};
require $file or die "require() failed\n";
unlink $file or die "Can't delete file '$file': $!: $^E\n";
####
use strict;
use warnings;
my $file = 'reqtest.pl';
my $interrupted = 0;
open my $fh, ">$file" or die "Can't create file '$file': $!: $^E\n";
print $fh <<'EOT';
BEGIN {
print STDERR "Hit CTRL+C now!\n";
sleep 3;
}
1;
EOT
close $fh;
$SIG{INT} = sub {
print "Caught SIGINT. Terminating.\n";
$interrupted = 1;
};
sub handle_sigint {
if (-f $file) {
unlink $file or warn "Can't delete file '$file': $!: $^E\n";
}
else {
print STDERR "file is already deleted (!)\n";
}
exit;
}
require $file or die "require() failed\n";
handle_sigint() if $interrupted;
unlink $file or die "Can't delete file '$file': $!: $^E\n";