Signals are used to notify processes of a synchronous or asynchronous event. When a signal is sent, operating system interrupts the flow of execution of target process to deliver the signal. If the process has a registered signal handler, the signal handler function will handle signals sent to the process. Otherwise, the default signal handler is executed. The default action for most signals is to terminate the process.
Almost all popular programming languages including Perl provide programming interfaces to send and receive signals. We will explore signal handling with a simple example in this blog post.
All Perl programs have access to a global variable %SIG
hash that contains names or references of user-installed signal handlers. Each key in %SIG hash corresponds to a signal and associated value is the action to take when Perl runtime receives the corresponding signal. To ignore the signal, set the action to 'IGNORE
'. To let the system perform the default action for the signal, set the action to 'DEFAULT
'. To perform a desired action in response to a signal, write a signal handler with desired action(s) and set the action to execute that signal handler. To reiterate, a signal handler is just a function/subroutine including anonymous subroutines.
eg.,
$SIG{INT} = 'IGNORE' ; # ignore signal INT $SIG{INT} = 'DEFAULT'; # default signal handling for signal INT $SIG{INT} = sub { die "Caught sigint $!" }; # signal handler - anonymous subroutine $SIG{INT} = \&handle_sigint; # signal handler - execute routine "handle_sigint"
Following sample code catches keyboard event Ctrl-C that generates SIGINT signal.
$ cat -n /var/tmp/sigint.pl 1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 sub handle_sigint { 7 print "Caught signal $! \n"; 8 } 9 10 # install signal handler for SIGINT 11 $SIG{INT} = \&handle_sigint; 12 13 print "Current time: " . localtime() . "\n"; 14 sleep(30); 15 print "Time now: ". localtime() . "\n"; $ /var/tmp/sigint.pl Current time: Thu Dec 31 16:35:00 2020 ^CCaught signal Interrupted system call Time now: Thu Dec 31 16:35:07 2020
In this example, execution continued after the keyboard interrupt was handled. However note that not all signals allow execution to continue after the signal handler was executed.
No comments:
Post a Comment