Skip to content

Sighandlers

3 messages · Ulrich Staudinger, Brian Ripley

#
Hello everyone,

I am searching and searching and can't find an answer.

I try to register a sighandler in my extension's C code. But my
sighandler is never called. Is there anything preventing extensions to
receive signals?

I register like this:

[.. some code that works ..]
      // register the sigint listeners.
      if (signal(SIGTERM, killReceiver) == SIG_ERR) {
        printf("2 An error occurred while setting a signal
handler.%s\n", stderr);
      }
      if (signal(SIGHUP, killReceiver) == SIG_ERR) {
        printf("3 An error occurred while setting a signal
handler.%s\n", stderr);
      }
      if (signal(SIGINT, killReceiver) == SIG_ERR) {
        printf("4 An error occurred while setting a signal
handler.%s\n", stderr);
      }
[.. even more code that works ..]


handler code:

static void killReceiver(int signum){
  printf("Cleaning up\n");
}


When I exit R, my signal handler is not being called. Am I listening
to the right signals? Do I have some misunderstanding on my side?

Funny side story, if I manually raise(SIGINT), my handlers gets called.


Thanks for some light on this,

Ulrich





--
Ulrich Staudinger

P: +41 79 702 05 95
E: ustaudinger at activequant.com

http://www.activequant.com
Connect online: https://www.xing.com/profile/Ulrich_Staudinger
#
R has its own signal handlers, including for SIGINT.

What is your 'extension'?   If it is a program embedding R, the order of 
setting signal handlers will matter, and in any case R's handler if ever 
called it will reset the handler to itself.

If it is a package, it should not be messing with the process into which 
it is loaded.
On 17/11/2012 15:56, Ulrich Staudinger wrote:
Did you search the source code?

  
    
7 days later
#
Hello there,

On Sun, Nov 18, 2012 at 3:17 PM, Prof Brian Ripley
<ripley at stats.ox.ac.uk> wrote:
The extension does open a socket connection to some distant server. It
serves as a data buffer, from where the R-main thread may poll data.
This is entirely clear.

In this particular case, I used fork() to fork off a new process. For
obvious reasons, this process stayed alive beyond the R-session.  In
other words, I terminated R and my forked off process continued
running. The natural approach would be to register a sighandler and
get notified about R's termination, so that the afore mentioned
buffering process may terminate gracefuly, too.

I solved it by using pthreads rather than fork(), as the pthread is
attached to a parent process and will terminate with it.
That's a bit beyond me at the moment.


Thanks,
Ulrich