void unix_init_signals(void) { struct sigaction memory_sigaction; struct sigaction misc_sigaction; struct sigaction ignore_sigaction; memset(&memory_sigaction,0,sizeof(struct sigaction)); sigemptyset(&memory_sigaction.sa_mask); memory_sigaction.sa_sigaction = memory_signal_handler; memory_sigaction.sa_flags = SA_SIGINFO; sigaction_safe(SIGBUS,&memory_sigaction,NULL); sigaction_safe(SIGSEGV,&memory_sigaction,NULL); memset(&misc_sigaction,0,sizeof(struct sigaction)); sigemptyset(&misc_sigaction.sa_mask); misc_sigaction.sa_sigaction = misc_signal_handler; misc_sigaction.sa_flags = SA_SIGINFO; sigaction_safe(SIGABRT,&misc_sigaction,NULL); sigaction_safe(SIGFPE,&misc_sigaction,NULL); sigaction_safe(SIGQUIT,&misc_sigaction,NULL); sigaction_safe(SIGILL,&misc_sigaction,NULL); memset(&ignore_sigaction,0,sizeof(struct sigaction)); sigemptyset(&ignore_sigaction.sa_mask); ignore_sigaction.sa_handler = SIG_IGN; sigaction_safe(SIGPIPE,&ignore_sigaction,NULL); }
void factor_vm::unix_init_signals() { /* OpenBSD doesn't support sigaltstack() if we link against libpthread. See http://redmine.ruby-lang.org/issues/show/1239 */ #ifndef __OpenBSD__ signal_callstack_seg = new segment(callstack_size,false); stack_t signal_callstack; signal_callstack.ss_sp = (char *)signal_callstack_seg->start; signal_callstack.ss_size = signal_callstack_seg->size; signal_callstack.ss_flags = 0; if(sigaltstack(&signal_callstack,(stack_t *)NULL) < 0) fatal_error("sigaltstack() failed",0); #endif struct sigaction memory_sigaction; struct sigaction misc_sigaction; struct sigaction fpe_sigaction; struct sigaction ignore_sigaction; memset(&memory_sigaction,0,sizeof(struct sigaction)); sigemptyset(&memory_sigaction.sa_mask); memory_sigaction.sa_sigaction = memory_signal_handler; memory_sigaction.sa_flags = SA_SIGINFO | SA_ONSTACK; sigaction_safe(SIGBUS,&memory_sigaction,NULL); sigaction_safe(SIGSEGV,&memory_sigaction,NULL); memset(&fpe_sigaction,0,sizeof(struct sigaction)); sigemptyset(&fpe_sigaction.sa_mask); fpe_sigaction.sa_sigaction = fpe_signal_handler; fpe_sigaction.sa_flags = SA_SIGINFO | SA_ONSTACK; sigaction_safe(SIGFPE,&fpe_sigaction,NULL); memset(&misc_sigaction,0,sizeof(struct sigaction)); sigemptyset(&misc_sigaction.sa_mask); misc_sigaction.sa_sigaction = misc_signal_handler; misc_sigaction.sa_flags = SA_SIGINFO | SA_ONSTACK; sigaction_safe(SIGQUIT,&misc_sigaction,NULL); sigaction_safe(SIGILL,&misc_sigaction,NULL); /* We don't use SA_IGN here because then the ignore action is inherited by subprocesses, which we don't want. There is a unit test in io.launcher.unix for this. */ memset(&ignore_sigaction,0,sizeof(struct sigaction)); sigemptyset(&ignore_sigaction.sa_mask); ignore_sigaction.sa_sigaction = ignore_signal_handler; ignore_sigaction.sa_flags = SA_SIGINFO | SA_ONSTACK; sigaction_safe(SIGPIPE,&ignore_sigaction,NULL); }
void factor_vm::handle_ctrl_c() { struct sigaction fep_sigaction; init_sigaction_with_handler(&fep_sigaction, fep_signal_handler); sigaction_safe(SIGINT, &fep_sigaction, NULL); }
void factor_vm::unix_init_signals() { init_signal_pipe(this); signal_callstack_seg = new segment(callstack_size, false); stack_t signal_callstack; signal_callstack.ss_sp = (char*)signal_callstack_seg->start; signal_callstack.ss_size = signal_callstack_seg->size; signal_callstack.ss_flags = 0; if (sigaltstack(&signal_callstack, (stack_t*)NULL) < 0) fatal_error("sigaltstack() failed", 0); { struct sigaction memory_sigaction; init_sigaction_with_handler(&memory_sigaction, memory_signal_handler); sigaction_safe(SIGBUS, &memory_sigaction, NULL); sigaction_safe(SIGSEGV, &memory_sigaction, NULL); sigaction_safe(SIGTRAP, &memory_sigaction, NULL); } { struct sigaction fpe_sigaction; init_sigaction_with_handler(&fpe_sigaction, fpe_signal_handler); sigaction_safe(SIGFPE, &fpe_sigaction, NULL); } { struct sigaction synchronous_sigaction; init_sigaction_with_handler(&synchronous_sigaction, synchronous_signal_handler); sigaction_safe(SIGILL, &synchronous_sigaction, NULL); sigaction_safe(SIGABRT, &synchronous_sigaction, NULL); } { struct sigaction enqueue_sigaction; init_sigaction_with_handler(&enqueue_sigaction, enqueue_signal_handler); sigaction_safe(SIGWINCH, &enqueue_sigaction, NULL); sigaction_safe(SIGUSR1, &enqueue_sigaction, NULL); sigaction_safe(SIGCONT, &enqueue_sigaction, NULL); sigaction_safe(SIGURG, &enqueue_sigaction, NULL); sigaction_safe(SIGIO, &enqueue_sigaction, NULL); sigaction_safe(SIGPROF, &enqueue_sigaction, NULL); sigaction_safe(SIGVTALRM, &enqueue_sigaction, NULL); #ifdef SIGINFO sigaction_safe(SIGINFO, &enqueue_sigaction, NULL); #endif } handle_ctrl_c(); { struct sigaction sample_sigaction; init_sigaction_with_handler(&sample_sigaction, sample_signal_handler); sigaction_safe(SIGALRM, &sample_sigaction, NULL); } /* We don't use SA_IGN here because then the ignore action is inherited by subprocesses, which we don't want. There is a unit test in io.launcher.unix for this. */ { struct sigaction ignore_sigaction; init_sigaction_with_handler(&ignore_sigaction, ignore_signal_handler); sigaction_safe(SIGPIPE, &ignore_sigaction, NULL); /* We send SIGUSR2 to the stdin_loop thread to interrupt it on FEP */ sigaction_safe(SIGUSR2, &ignore_sigaction, NULL); } }