Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

trouble with custom signal handlers

by casaschi (Novice)
on Apr 17, 2016 at 10:18 UTC ( [id://1160702]=perlquestion: print w/replies, xml ) Need Help??

casaschi has asked for the wisdom of the Perl Monks concerning the following question:

Hello, having trouble with custom signal handlers. In my code I have:
sub handleSigs { my ($signalReceived) = @_; my $exitVal = 0; log_terminal("warning: received $signalReceived signal"); if ($signalReceived eq "INT") { $exitVal = 1; } elsif ($signalReceived eq "USR1") { $exitVal = 2; } elsif ($signalReceived eq "USR2") { $exitVal = 3; } myExit($exitVal); } $SIG{USR1}=\&handleSigs; $SIG{USR2}=\&handleSigs;
The application talks to a custom telnet server, waiting for messages and processing those messages. If I send a SIGUSR1 to my process I get this error message:
Signal SIGUSR1 received, but no signal handler set.
How best to debug this situation? PS: I read about safe/unsafe signals but the error message I got does not seem to apply unless I miss something. Using perl v5.20.2 on linux debian. Thanks.

Replies are listed 'Best First'.
Re: trouble with custom signal handlers
by casaschi (Novice) on Apr 17, 2016 at 12:53 UTC
    I might have been able to isolate the problem, it seems related to the use of the Safe module. This shows the problem:
    use warnings; use strict; use Safe; our $mySafe = new Safe; sub handleSigs { my ($signalReceived) = @_; my $exitVal = 0; warn("warning: received $signalReceived signal"); if ($signalReceived eq "INT") { $exitVal = 1; } elsif ($signalReceived eq "USR1") { $exitVal = 2; } elsif ($signalReceived eq "USR2") { $exitVal = 3; } exit($exitVal); } $SIG{USR1}=\&handleSigs; $SIG{USR2}=\&handleSigs; $mySafe->reval("10 + 20"); print "My PID is $$\n"; sleep(100); print "Exiting\n";
    Now I just need to dig documentation of the Safe module to find out what is going on with http://perldoc.perl.org/Safe.html

      Safe almost certainly uses signal handlers; and on the evidence of this code, it apparently doesn't restore any old ones.

      The solution might be to wrap reval() with code that saves and restores any existing signal handlers either side of calling that method.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Thanks for the confirmation. I'll probably do what you suggest although it should really be fixed in the Safe module (why does Safe need to reset ALL signal handlers?). Otherwise I can see cases where a signal at the wrong time could have unpredictable effects.
Re: trouble with custom signal handlers
by haukex (Archbishop) on Apr 17, 2016 at 10:51 UTC

    Hi casaschi,

    I couldn't reproduce the error you showed with your example code. I tried:

    use warnings; use strict; sub handleSigs { my ($signalReceived) = @_; my $exitVal = 0; warn("warning: received $signalReceived signal"); if ($signalReceived eq "INT") { $exitVal = 1; } elsif ($signalReceived eq "USR1") { $exitVal = 2; } elsif ($signalReceived eq "USR2") { $exitVal = 3; } exit($exitVal); } $SIG{USR1}=\&handleSigs; $SIG{USR2}=\&handleSigs; print "My PID is $$\n"; sleep(10); print "Exiting\n";

    And when I send a SIGUSR1 or SIGUSR2, I got the expected message warning: received USR1 signal at  ....

    I'm guessing there's some part of your code that is relevant to the problem that you haven't shown. If you could try to boil down your code to something that reproduces the problem, that would be very helpful. See also Short, Self Contained, Correct Example

    Regards,
    -- Hauke D

      @haukex: thanks for looking into this. The application is few hundred lines long, so definitely something elsewhere might have an impact, however I could not easily isolate the issue. Any suggestion how to approach debugging this. Also, could the delayed signal issue (see safe/unsafe signal) result in the error message about the missing signal handler? Anything else that could de-register a signal handler?
        Anything else that could de-register a signal handler?

        Usually, signal handlers are set and unset by assigning to %SIG, so start looking for assignments to %SIG. A text search for "SIG" should be sufficient.

        XS code can mess with signals behind your back, and without perl noticing it. If you use XS code, search for signal and sigaction in the XS code.

        The POSIX module also implements a wrapper for sigaction, so you may also want to search for sigaction in the perl code.

        And the most obvious one: Search for the constant part of the error message ("received, but no signal handler set.") in the code.

        A quick CPAN search reveals that the message may actually come from within perl, from the thread handling or the magic handling code. However, perldiag does not document this message. So, it looks to me like you have really messed up perl's internals.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
        Any suggestion how to approach debugging this.

        Is it possible that you're calling a module that implements its own local signal handling for something and instead of restoring what was there previously, it just sets them to undef?


        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
        In the absence of evidence, opinion is indistinguishable from prejudice.
Re: trouble with custom signal handlers
by casaschi (Novice) on Apr 18, 2016 at 09:26 UTC
    Thank you all that took the time to look at my question and post your reply. It really helped and now my application responds to signals (with the caveat around the use of Safe as pointed in some of the notes). Thanks!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1160702]
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others studying the Monastery: (4)
As of 2024-03-28 15:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found