Beefy Boxes and Bandwidth Generously Provided by pair Networks Bob
There's more than one way to do things
 
PerlMonks  

Re^2: DESTROY on CTRL+C

by Happy-the-monk (Monsignor)
on Aug 29, 2013 at 12:50 UTC ( #1051423=note: print w/ replies, xml ) Need Help??


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

Update: I wrote: ...

in front of your script

anywhere in your script should be fine.

...but that was a misconception. The %SIG hash is not all that magical.
McA is right, it must be writ before the actual code to be affected by the signal.

Cheers, Sören

Créateur des bugs mobiles - let loose once, run everywhere.
(hooked on the Perl Programming language)


Comment on Re^2: DESTROY on CTRL+C
Download Code
Re^3: DESTROY on CTRL+C
by McA (Deacon) on Aug 29, 2013 at 13:00 UTC

    Yup, that's more precise...thumbs up, äähm no, ++. ;-)

Re^3: DESTROY on CTRL+C
by gri6507 (Deacon) on Aug 29, 2013 at 13:08 UTC
    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.)

      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

      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
Node Status?
node history
Node Type: note [id://1051423]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2014-04-21 08:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (492 votes), past polls