Unix/Linux Go Back    


Programming Post questions about C, C++, Java, SQL, and other programming languages here.

Perl: trap signal 'exit': why I am not able to have it work??

Programming


Tags
perl, signal, trap

Reply    
 
Thread Tools Search this Thread Display Modes
    #1  
Old Unix and Linux 10-30-2017   -   Original Discussion by alex_5161
alex_5161's Unix or Linux Image
alex_5161 alex_5161 is offline
Registered User
 
Join Date: Jan 2007
Last Activity: 1 November 2017, 1:04 PM EDT
Location: Detroit
Posts: 195
Thanks: 24
Thanked 3 Times in 3 Posts
Perl: trap signal 'exit': why I am not able to have it work??

First time trying to work with signals in Perl.
Reviewing example I try it, but not able to get it work for 'exit'.
I hope, I am correct, assuming, that the ending any code by

Code:
exit $return_code;

the $SIG{EXIT} should be de-referenced and processed?!
So, I have such code, that, I assume, should, but does not process signal handling:

Code:
#!/bin/perl
sub trp_h{
  print "\nIn 'trp_h()'. ".
       "\nReceived parameters \@_: ".(join ", ",@_).
       "\n\$! as a number: ".($!+0).", as a string: ".(" ".$!).
       "\n now 'sleep 5' before return.";
  sleep 5;
}
$SIG{EXIT}='trp_h';
print "\nSet handler: $SIG{EXIT}\n";
exit(5);
print "after first exit";

$SIG{EXIT}=\&trp_h;
print "\nSet handler to code: $SIG{EXIT}\n";
exit(3);
print "after second exit\n";

print "Restoring to default\n";
$SIG{EXIT}='DEFAULT';
exit(2);
exit 1;

Please, help me understand what is wrong or,
if I mistaken on assumption that the 'exit()' is processed by the $SIG{EXIT}, how it could be handled to process activity, such as in UNIX 'trap "..." EXIT' command?

Thanks!
Sponsored Links
    #2  
Old Unix and Linux 10-30-2017   -   Original Discussion by alex_5161
Don Cragun's Unix or Linux Image
Don Cragun Don Cragun is offline Forum Staff  
Administrator
 
Join Date: Jul 2012
Last Activity: 13 December 2017, 3:56 AM EST
Location: San Jose, CA, USA
Posts: 10,772
Thanks: 590
Thanked 3,771 Times in 3,219 Posts
There is no SIGEXIT on UNIX systems. Standards conforming UNIX shells can set a trap on exit such as:

Code:
trap 'rm -f" $tempfile"' EXIT

which will cause the shell to execute the commands in that trap just before exiting. Note that the exit utility in the shell command language looks to see if a trap on exit has been installed (and if so invokes it before issuing the UNIX exit(exit_code); system call). There is no return from that trap handler -- once the commands specified in the exit condition trap handler complete, the shell exits.

I make no claim to any knowledge about how perl handles $SIG{EXIT}=handler;, but if perl handles it similarly to the way shells handle trap 'commands' EXIT, that trap will only be executed once. If perl's $SIG{EXIT}=handler; is similar to setting a signal handler in the C programming language; there is no SIGEXIT so setting a signal handler for that signal should fail.
The Following User Says Thank You to Don Cragun For This Useful Post:
jim mcnamara (10-30-2017)
Sponsored Links
    #3  
Old Unix and Linux 10-31-2017   -   Original Discussion by alex_5161
alex_5161's Unix or Linux Image
alex_5161 alex_5161 is offline
Registered User
 
Join Date: Jan 2007
Last Activity: 1 November 2017, 1:04 PM EDT
Location: Detroit
Posts: 195
Thanks: 24
Thanked 3 Times in 3 Posts
Thanks, Don Cragun, for the answer and information.
Yes, I have realized that there is no EXIT signal neither in shell (by kill -l), nor in Perl %SIG hash initially. Also, the $Config{sig_name} does not have it (available after 'use Config;'.)
But, some how the perl should process the 'exit()'.
As you mentioned and I have seen, in shell the 'trap EXIT' works, at least, once.
OK, I could accept, the EXIT in form of signal (say, just defined) is uninterruptible, but, even having the $SEG{EXIT} defined, it is not processed!
I my example it would, at least print out some info! No, not happening!
I would be completely fine correcting it to have the EXIT-trap be processed one time! That what I am looking for, actually!
    #4  
Old Unix and Linux 10-31-2017   -   Original Discussion by alex_5161
Don Cragun's Unix or Linux Image
Don Cragun Don Cragun is offline Forum Staff  
Administrator
 
Join Date: Jul 2012
Last Activity: 13 December 2017, 3:56 AM EST
Location: San Jose, CA, USA
Posts: 10,772
Thanks: 590
Thanked 3,771 Times in 3,219 Posts
It looks like the $SIG(signal_number) function in perl sets a signal catching function for the signal specified by signal_number. Since no such signal is every received by perl, that signal handler is never invoked.

As I said, I'm not fluent in perl, but it is obvious that the mechanism you're using is not designed to work that way in perl. You need to either find another way to do it in perl or extend perl to do what you want. Just making up a new signal name isn't going to magically make perl guess that a should send itself a signal (that the underlying operating system doesn't provide) before it is terminated by some other signal or by the user exiting the code perl is running.

Or, maybe you could convert your perl script to a shell script and use the shell command language's trap command to do what you want?
Sponsored Links
    #5  
Old Unix and Linux 11-01-2017   -   Original Discussion by alex_5161
alex_5161's Unix or Linux Image
alex_5161 alex_5161 is offline
Registered User
 
Join Date: Jan 2007
Last Activity: 1 November 2017, 1:04 PM EDT
Location: Detroit
Posts: 195
Thanks: 24
Thanked 3 Times in 3 Posts
OK; Thanks, Don, for discussing all that with me!
Appreciate it!
I have found answer for my situation and that is simple!
Just I've been following the shell script activity and did not guess simplest way:
- the END{..} block!
That is any activities to be processed by any Perl script regular exit!
Thus; no any need to catch EXIT at all!
The Following User Says Thank You to alex_5161 For This Useful Post:
Don Cragun (11-01-2017)
Sponsored Links
    #6  
Old Unix and Linux 11-03-2017   -   Original Discussion by alex_5161
apmcd47's Unix or Linux Image
apmcd47 apmcd47 is offline
Registered User
 
Join Date: Feb 2011
Last Activity: 13 December 2017, 4:45 AM EST
Posts: 284
Thanks: 13
Thanked 76 Times in 73 Posts
See this link. When Perl encounters the exit keyword it will exit, but not before executing any END blocks defined by your code or imported packages.
Example:
Code:
#!/bin/perl
END { printf qq(Bye bye!\n); }
exit;

Andrew
The Following User Says Thank You to apmcd47 For This Useful Post:
rbatte1 (11-03-2017)
Sponsored Links
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Linux More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
VM trap may work differently than a pure install trap. newuser45 Homework & Coursework Questions 2 05-20-2013 11:14 AM
How trap a signal in shell script? crackthehit007 Shell Programming and Scripting 1 07-05-2010 01:17 PM
How to Trap kill -9 signal puneet.goel Shell Programming and Scripting 1 08-12-2009 05:12 AM
trap signal for enter key Sreejith_VK Shell Programming and Scripting 4 04-21-2008 05:35 AM
Fmli Signal/trap Marcos Brito Shell Programming and Scripting 0 03-22-2005 03:20 PM



All times are GMT -4. The time now is 12:51 PM.