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


 
Thread Tools Search this Thread
Top Forums Programming Perl: trap signal 'exit': why I am not able to have it work??
# 1  
Old 10-30-2017
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!
# 2  
Old 10-30-2017
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.
This User Gave Thanks to Don Cragun For This Post:
# 3  
Old 10-31-2017
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 10-31-2017
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?
# 5  
Old 11-01-2017
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!
This User Gave Thanks to alex_5161 For This Post:
# 6  
Old 11-03-2017
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
This User Gave Thanks to apmcd47 For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Homework & Coursework Questions

VM trap may work differently than a pure install trap.

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: That is the last reply I received from my instructor, and I'm looking for some alternatives. When using... (2 Replies)
Discussion started by: newuser45
2 Replies

2. Shell Programming and Scripting

Quiting running process without catching TRAP signal

Hi, I would like to ask, if is it possible to quit running loop in the script any other way than catching the trap signal. Ctrl-C ends only current running instance of process but not whole script. Any clues? (3 Replies)
Discussion started by: smoofy
3 Replies

3. Shell Programming and Scripting

How trap a signal in shell script?

Hi , i have a scenario where...i have to put a check where if script is executing more than 15mins i have to kill that script and n retry again 2nd time. i this case i can use background process to do it but i feel trap will be the efficent way to do so... but i dont know much about it... (1 Reply)
Discussion started by: crackthehit007
1 Replies

4. Shell Programming and Scripting

Record the Signal Type or Number in Bash Trap function

In my Bash script I have an exit/cleanup function in a trap statement like: trap exitCleanup 1 2 3 6 15 25 Is there anyway to capture which signal # has occurred to record in a log file. Please note I am trying to avoid something like: trap 'mySignal=1; exitCleanup' 1 trap... (1 Reply)
Discussion started by: ckmehta
1 Replies

5. Shell Programming and Scripting

How to Trap kill -9 signal

I just want to trap kill -9 signal issued by any of user from any terminal and just capture that user terminal who had raised this kill -9 command (1 Reply)
Discussion started by: puneet.goel
1 Replies

6. UNIX for Dummies Questions & Answers

trap signal on user logout ?

hi all , I want to execute a script on the user logout(using gnome environment). Is ther any way to execute it through TRAP stmt? (2 Replies)
Discussion started by: harsha10
2 Replies

7. Shell Programming and Scripting

Getting exit status of child in trap handler

Hi, I have a trap problem when calling a child script in the background. I know there are a lot of threads here on the issue of traps and signals, I think I have read all the relevant ones, but still haven't found an answer to my problem. I'm working on Linux or HP, the script as you can see... (4 Replies)
Discussion started by: rimon
4 Replies

8. Shell Programming and Scripting

trap signal for enter key

hi , What is the trap signal for "ENTER key"? (4 Replies)
Discussion started by: Sreejith_VK
4 Replies

9. Shell Programming and Scripting

how to trap unix signal if the process killed/interupt occured in bash...

hey champs, I have a process running.......i have to catch/trap the signal when the process is being interupted/killed (kill -9 pid) option...... how can i achieve the same thru my process........ let my process is a.sh and it supposed to take 13 mins to complete, but due to some problem ,... (15 Replies)
Discussion started by: manas_ranjan
15 Replies

10. Shell Programming and Scripting

Fmli Signal/trap

Does anyone know how to program signals in fmli? My fmli script goes in loop when the telnet session is closed. When I start the script from the prompt the issue do not happen. But when it is started by the login process it hags. That's why I want to program the SIGHUP to exit/finish the script.... (0 Replies)
Discussion started by: Marcos Brito
0 Replies
Login or Register to Ask a Question