#include #include #include #include #include #ifndef SA_RESTART #define SA_RESTART 0 #endif unsigned jiffies; static sigset_t posix_signal_mask; static void clock_start(int us) { struct itimerval new_it; new_it.it_value.tv_sec = 0; new_it.it_value.tv_usec = us; new_it.it_interval.tv_sec = 0; new_it.it_interval.tv_usec = us; setitimer(ITIMER_REAL, &new_it, 0); } static void isr_enable(unsigned level) { if (level == 0) { sigprocmask(SIG_UNBLOCK, &posix_signal_mask, 0); } else { sigprocmask(SIG_BLOCK, &posix_signal_mask, 0); } } static void isr_handler(int sig_num) { switch(sig_num) { case SIGCHLD: break; case SIGALRM: ++jiffies; break; default: break; } } void posix_init(void) { struct sigaction act; sigset_t mask; /* * Block all the signals except SIGTRAP (for the debugger) * and fatal error signals. */ sigfillset(&posix_signal_mask); sigdelset(&posix_signal_mask, SIGTRAP); sigdelset(&posix_signal_mask, SIGABRT); #ifdef SIGIOT sigdelset(&posix_signal_mask, SIGIOT); #endif sigdelset(&posix_signal_mask, SIGCONT); sigdelset(&posix_signal_mask, SIGSEGV); sigdelset(&posix_signal_mask, SIGBUS); sigdelset(&posix_signal_mask, SIGFPE); isr_enable(1); /* Unblock signals. */ mask = posix_signal_mask; sigprocmask(SIG_UNBLOCK, &mask, 0); act.sa_handler = isr_handler; act.sa_mask = mask; act.sa_flags = SA_RESTART; sigaction(SIGHUP, &act, 0); sigaction(SIGINT, &act, 0); sigaction(SIGQUIT, &act, 0); sigaction(SIGILL, &act, 0); #ifdef SIGEMT sigaction(SIGEMT, &act, 0); #endif sigaction(SIGFPE, &act, 0); sigaction(SIGKILL, &act, 0); sigaction(SIGBUS, &act, 0); sigaction(SIGSEGV, &act, 0); #ifdef SIGSYS sigaction(SIGSYS, &act, 0); #endif sigaction(SIGPIPE, &act, 0); sigaction(SIGALRM, &act, 0); sigaction(SIGTERM, &act, 0); sigaction(SIGUSR1, &act, 0); sigaction(SIGUSR2, &act, 0); sigaction(SIGCHLD, &act, 0); sigaction(SIGCLD, &act, 0); #ifdef SIGPWR sigaction(SIGPWR, &act, 0); #endif sigaction(SIGVTALRM, &act, 0); sigaction(SIGPROF, &act, 0); sigaction(SIGIO, &act, 0); sigaction(SIGWINCH, &act, 0); sigaction(SIGSTOP, &act, 0); sigaction(SIGTTIN, &act, 0); sigaction(SIGTTOU, &act, 0); sigaction(SIGURG, &act, 0); #ifdef SIGLOST sigaction(SIGLOST, &act, 0); #endif clock_start(1000); } int main(int argc, char *argv[]) { posix_init(); while (jiffies < 3000); printf("Hit any key to quit...\n"); while (1) { if (getchar() > 0) break; } return 0; }