1 /* protable signal() like */ 2 3 #include <signal.h> 4 5 /* Portable signal() from R.Stevens, 6 * modified to reset the handler */ Signal(int signo,void (* func)(int))7void (*Signal(int signo, void (*func)(int)))(int) 8 { 9 struct sigaction act, oact; 10 11 act.sa_handler = func; 12 sigemptyset(&act.sa_mask); 13 act.sa_flags = 0; /* So if set SA_RESETHAND is cleared */ 14 if (signo == SIGALRM) 15 { 16 #ifdef SA_INTERRUPT 17 act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */ 18 #endif 19 } 20 else 21 { 22 #ifdef SA_RESTART 23 act.sa_flags |= SA_RESTART; /* SVR4, 4.4BSD, Linux */ 24 #endif 25 } 26 if (sigaction(signo, &act, &oact) == -1) 27 return SIG_ERR; 28 return (oact.sa_handler); 29 } 30