#include #include #include #include extern int errno; main() { sigset_t UnBlockSig, BlockSig, AuthBlockSig; struct sigaction act, oact; void handler(); sigemptyset(&UnBlockSig); sigfillset(&BlockSig); sigfillset(&AuthBlockSig); /* * Unmark those signals that should never be blocked. Some of these * signal names don't exist on all platforms. Most do, but might as * well ifdef them all for consistency... */ #ifdef SIGTRAP sigdelset(&BlockSig, SIGTRAP); sigdelset(&AuthBlockSig, SIGTRAP); #endif #ifdef SIGABRT sigdelset(&BlockSig, SIGABRT); sigdelset(&AuthBlockSig, SIGABRT); #endif #ifdef SIGILL sigdelset(&BlockSig, SIGILL); sigdelset(&AuthBlockSig, SIGILL); #endif #ifdef SIGFPE sigdelset(&BlockSig, SIGFPE); sigdelset(&AuthBlockSig, SIGFPE); #endif #ifdef SIGSEGV sigdelset(&BlockSig, SIGSEGV); sigdelset(&AuthBlockSig, SIGSEGV); #endif #ifdef SIGBUS sigdelset(&BlockSig, SIGBUS); sigdelset(&AuthBlockSig, SIGBUS); #endif #ifdef SIGSYS sigdelset(&BlockSig, SIGSYS); sigdelset(&AuthBlockSig, SIGSYS); #endif #ifdef SIGCONT sigdelset(&BlockSig, SIGCONT); sigdelset(&AuthBlockSig, SIGCONT); #endif #ifdef SIGTERM sigdelset(&AuthBlockSig, SIGTERM); #endif #ifdef SIGQUIT sigdelset(&AuthBlockSig, SIGQUIT); #endif #ifdef SIGALRM sigdelset(&AuthBlockSig, SIGALRM); #endif act.sa_handler = handler; sigemptyset(&act.sa_mask); act.sa_flags = 0; // if (signo != SIGALRM) // act.sa_flags |= SA_RESTART; /* #ifdef SA_NOCLDSTOP if (signo == SIGCHLD) act.sa_flags |= SA_NOCLDSTOP; #endif */ if (sigaction(SIGALRM, &act, &oact) < 0) fprintf(stderr, "sigaction failed, errno = %d\n",errno); handler(0); for (;;) ; } void handler(sig) { struct itimerval timeval; memset(&timeval,0,sizeof(struct itimerval)); timeval.it_value.tv_sec=5; timeval.it_value.tv_usec=0; if (setitimer(ITIMER_REAL,&timeval,NULL) < 0) fprintf(stderr, "could not set itimer errono = %d\n"); printf("caught sig %d\n",sig); }