|
NAMENet::Server::SIG - adpf - Safer signal handling SYNOPSIS use Net::Server::SIG qw(register_sig check_sigs);
use IO::Select ();
use POSIX qw(WNOHANG);
my $select = IO::Select->new();
register_sig(PIPE => 'IGNORE',
HUP => 'DEFAULT',
USR1 => sub { print "I got a SIG $_[0]\n"; },
USR2 => sub { print "I got a SIG $_[0]\n"; },
CHLD => sub { 1 while waitpid(-1, WNOHANG) > 0; },
);
# add some handles to the select
$select->add(\*STDIN);
# loop forever trying to stay alive
while (1) {
# do a timeout to see if any signals got passed us
# while we were processing another signal
my @fh = $select->can_read(10);
my $key;
my $val;
# this is the handler for safe (fine under unsafe also)
if (check_sigs()) {
# or my @sigs = check_sigs();
next unless @fh;
}
my $handle = $fh[@fh];
# do something with the handle
}
DESCRIPTIONSignals prior in Perl prior to 5.7 were unsafe. Since then signals have been implemented in a more safe algorithm. Net::Server::SIG provides backwards compatibility, while still working reliably with newer releases. Using a property of the select() function, Net::Server::SIG attempts to fix the unsafe problem. If a process is blocking on select() any signal will short circuit the select. Using this concept, Net::Server::SIG does the least work possible (changing one bit from 0 to 1). And depends upon the actual processing of the signals to take place immediately after the select call via the "check_sigs" function. See the example shown above and also see the sigtest.pl script located in the examples directory of this distribution. FUNCTIONS
AUTHORSPaul Seamons (paul@seamons.com) Rob B Brown (rob@roobik.com) - Provided a sounding board and feedback in creating Net::Server::SIG and sigtest.pl. LICENSE This package may be distributed under the terms of either the
GNU General Public License
or the
Perl Artistic License
All rights reserved.
|