Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Re: Can't catch signals after an exec?

by derby (Abbot)
on Mar 19, 2005 at 13:56 UTC ( [id://440924]=note: print w/replies, xml ) Need Help??


in reply to Can't catch signals after an exec?

from perlipc:

Not all platforms automatically reinstall their (native) signal handlers after a signal delivery. This means that the handler works only the first time the signal is sent. The solution to this problem is to use "POSIX" signal handlers if available, their behaviour is well-defined.

So to rework your example with the one from perlipc:

!/usr/bin/perl -w use POSIX (); use FindBin (); use File::Basename (); use File::Spec::Functions; $|=1; # make the daemon cross-platform, so exec always calls the script # itself with the right path, no matter how the script was invoked. my $script = File::Basename::basename($0); my $SELF = catfile $FindBin::Bin, $script; # POSIX unmasks the sigprocmask properly my $sigset = POSIX::SigSet->new(); my $action = POSIX::SigAction->new('sigHUP_handler', $sigset, &POSIX::SA_NODEFER); POSIX::sigaction(&POSIX::SIGINT, $action); sub sigHUP_handler { print "got SIGINT\n"; exec($SELF) or die "Couldn't restart: $!\n"; } code(); sub code { my $c = 0; while (++$c) { sleep 2; print "$$ - $c\n"; } }

-derby

Update: Sorry forgot to tell you. I have the same platform as you (Mac OS X 10.3.8, perl v5.8.1-RC3)

Update: And a lot more like your original code:

#!/usr/bin/perl use POSIX(); $|=1; $sub = sub { exec "$0" }; # POSIX unmasks the sigprocmask properly my $sigset = POSIX::SigSet->new(); my $action = POSIX::SigAction->new( $sub, $sigset, &POSIX::SA_NODEFER ); POSIX::sigaction(&POSIX::SIGINT, $action); print (++$counter), sleep 1 while 1

Replies are listed 'Best First'.
Re^2: Can't catch signals after an exec?
by ibm1620 (Hermit) on Oct 17, 2013 at 15:59 UTC
    In your reworking of the perlipc example, you use HUP and INT interchangeably. Did you intend to use one xor the other?

      Nope ... just a typo. It should one or the other. In the perldocs, they describe HUP but the OP was only interested in INT -- I foobar-ed the example by switching (but in this case it only matters from a maintenance/consistency view -- the signal SIGINT should probably not be handled my a method named sigHUP!).

      -derby

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://440924]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (3)
As of 2024-04-16 22:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found