/* ------------------------ sign.c ------------------------ */ #define SIGN_H # include # include "sign.h" void shell_handler(int sig){ if( (sig == SIGCHLD) || (sig == SIGCLD)) { int status; waitpid(0, &status, WNOHANG); lastExitStat = (status >> 8) & 255; } return; } struct sigaction newact, oldact; Sigfunc ignoresig(int sig) { static int first = 1; newact.sa_handler = shell_handler; if (first) { first = 0; if (sigemptyset(&newact.sa_mask) < 0) return SIG_ERR; newact.sa_flags = 0; newact.sa_flags |= SA_RESTART; if (sigaction(sig, &newact, &oldact) < 0) return SIG_ERR; else return oldact.sa_handler; } else { if (sigaction(sig, &newact, NULL) < 0) return SIG_ERR; else return NULL; } } struct sigaction newact_bg, oldact_bg; Sigfunc ignoresig_bg(int sig) { newact_bg.sa_handler = SIG_IGN; if (sigemptyset(&newact_bg.sa_mask) < 0) return SIG_ERR; newact_bg.sa_flags = 0; newact_bg.sa_flags |= SA_RESTART; if (sigaction(sig, &newact_bg, &oldact_bg) < 0) return SIG_ERR; else return oldact_bg.sa_handler; } Sigfunc entrysig(int sig) { if (sigaction(sig, &oldact, NULL) < 0 ) return SIG_ERR; else return NULL; }