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
Sighandlers
3 messages · Ulrich Staudinger, Brian Ripley
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:
Hello everyone, I am searching and searching and can't find an answer.
Did you search the source code?
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-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595
7 days later
Hello there, On Sun, Nov 18, 2012 at 3:17 PM, Prof Brian Ripley
<ripley at stats.ox.ac.uk> wrote:
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.
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.
If it is a package, it should not be messing with the process into which it is loaded.
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.
On 17/11/2012 15:56, Ulrich Staudinger wrote:
Hello everyone, I am searching and searching and can't find an answer.
Did you search the source code?
That's a bit beyond me at the moment. Thanks, 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