Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re^3: DESTROY on CTRL+C

by gri6507 (Deacon)
on Aug 29, 2013 at 13:08 UTC ( [id://1051429]=note: print w/replies, xml ) Need Help??


in reply to Re^2: DESTROY on CTRL+C
in thread DESTROY on CTRL+C

Thanks, that's kind of what I suspected, but wanted to confirm. I am a bit surprised though that a SIG{INT} does not automatically cause the DESTROY functions to be called. Just for completeness sake, does a SIG{INT} cause the END block to execute? P.S. I actually am using File::Temp in my code to generate the temporary file. However, because of system constraints, I cannot rely on any temporary directory other than pwd, and according to the documentation:
Note that if a temp directory is your current directory, it cannot be removed. chdir() out of the directory first before calling cleanup(). (For the cleanup at program exit when the CLEANUP flag is set, this happens automatically.)

Replies are listed 'Best First'.
Re^4: DESTROY on CTRL+C
by McA (Priest) on Aug 29, 2013 at 13:51 UTC

    I'm not sure what you mean. As soon as the SIG{INT} handler is installed and I press CTRL-C while your program sleeps I can see the output of the sig handler ('Delete') and the output of the DESTROY method ('In DESTROY()').

    To your second question:

    #!/usr/bin/env perl use strict; use warnings; use 5.010; $SIG{INT} = sub { say "Caught a signal"; exit 1; }; say "Program started"; say "Starting to sleep"; sleep 3; say "I've been sleeping long enough"; END { say "I'm in the END block"; }

    This code should give you confidence. In my case (Linux) the END block is executed.

    I'm not sure whether you mix up the creation of a temp directory and temp file. You can create a temp file in your pwd and unlink it with:

    my ($fh, $filename) = tempfile($template, DIR => '.'); unlink $filename;

    As long as $fh is open you will have a file to write to and read from.

    Have a look at:

    #!/usr/bin/env perl use strict; use warnings; use 5.010; use Cwd (); use Fcntl (); use File::Temp qw(tempfile); my $pwd = Cwd::getcwd; say "pwd: $pwd"; my $template = 'somthing.XXXXXXX'; my $dir = '.'; my ($fh, $filename) = tempfile($template, DIR => $dir); say "filename: $filename"; system("ls -l '$filename'"); unlink $filename; system("ls -l '$filename'"); say "Now store 'Put some text in' in the file"; print $fh "Put some text in\n"; say "Written to file, try to read"; seek $fh, Fcntl::SEEK_SET, 0; while(my $line = <$fh>) { print "Found in file: $line"; } close $fh; say "End of prog";

    McA

Re^4: DESTROY on CTRL+C
by vsespb (Chaplain) on Aug 29, 2013 at 19:22 UTC
    END is executed if you have SIG handler, and not executed if you have no.

    perlmod:
    An END code block is executed as late as possible, that is, after perl has finished running the program and just before the interpreter is being exited, even if it is exiting as a result of a die() function. (But not if it's morphing into another program via exec, or being blown out of the water by a signal--you have to trap that yourself (if you can).)

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1051429]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (4)
As of 2024-03-29 00:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found