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";