@@ -635,29 +635,34 @@ struct rtapi_module {
635635#define MAX_MODULES 64
636636#define MODULE_OFFSET 32768
637637
638+ #define WRITE_STDERR_STR (str ) ((void )!write(STDERR_FILENO, str, strlen(str)))
638639static void signal_handler (int sig, siginfo_t * /* si*/ , void * /* uctx*/ ) {
640+ // Read: https://www.man7.org/linux/man-pages/man7/signal-safety.7.html
639641 switch (sig) {
640642 case SIGXCPU:
641- // should not happen - must be handled in RTAPI if enabled
642- rtapi_print_msg (RTAPI_MSG_ERR, " rtapi_app: BUG: SIGXCPU received - exiting\n " );
643- _exit (0 );
643+ WRITE_STDERR_STR (" rtapi_app: SIGXCPU - shutting down\n " );
644+ break ;
645+ case SIGSEGV:
646+ WRITE_STDERR_STR (" rtapi_app: SIGSEGV - shutting down\n " );
647+ break ;
648+ case SIGILL:
649+ WRITE_STDERR_STR (" rtapi_app: SIGILL - shutting down\n " );
650+ break ;
651+ case SIGFPE:
652+ WRITE_STDERR_STR (" rtapi_app: SIGFPE - shutting down\n " );
644653 break ;
645-
646654 case SIGTERM:
647- rtapi_print_msg (RTAPI_MSG_ERR, " rtapi_app: SIGTERM - shutting down\n " );
648- _exit (0 );
655+ WRITE_STDERR_STR (" rtapi_app: SIGTERM - shutting down\n " );
649656 break ;
650-
651- default : // pretty bad
652- rtapi_print_msg (RTAPI_MSG_ERR, " rtapi_app: caught signal %d - dumping core\n " , sig);
653- sleep (1 ); // let syslog drain
654- signal (sig, SIG_DFL);
655- // for reasons unknown raise(sig); doesn't lead to core dump file
656- // but this will
657- kill (getpid (), sig);
657+ case SIGINT:
658+ WRITE_STDERR_STR (" rtapi_app: SIGINT - shutting down\n " );
659+ break ;
660+ default :
661+ WRITE_STDERR_STR (" rtapi_app: UNKNOWN - shutting down\n " );
658662 break ;
659663 }
660- _exit (1 );
664+
665+ _exit (-1 );
661666}
662667
663668const static size_t PRE_ALLOC_SIZE = 1024 * 1024 * 32 ;
@@ -766,6 +771,7 @@ static int harden_rt() {
766771 sig_act.sa_sigaction = signal_handler;
767772 sig_act.sa_flags = SA_SIGINFO;
768773
774+ sigaction (SIGXCPU, &sig_act, (struct sigaction *)NULL );
769775 sigaction (SIGSEGV, &sig_act, (struct sigaction *)NULL );
770776 sigaction (SIGILL, &sig_act, (struct sigaction *)NULL );
771777 sigaction (SIGFPE, &sig_act, (struct sigaction *)NULL );
0 commit comments