int main() { struct sigaction act; sigset_t ss; act.sa_sigaction = Handle; act.sa_flags = SA_SIGINFO; sigemptyset(&act.sa_mask); if (sigaction(SIGUSR1, &act, 0) != 0) { fprintf(stderr,"unable to set SIGUSR1 handler\n"); return 1; } sigemptyset(&act.sa_mask); if (sigaction(SIGUSR2, &act, 0) !=0) { fprintf(stderr,"unable to set SIGUSR2 handler\n"); return 1; } sigfillset(&ss); sigprocmask(SIG_SETMASK, &ss, 0); kill(getpid(), SIGUSR1); kill(getpid(), SIGUSR2); sigdelset(&ss, SIGUSR1); sigdelset(&ss, SIGUSR2); sigdelset(&ss, SIGSEGV); sigsuspend(&ss); sigprocmask(SIG_SETMASK, 0, &ss); CheckSigs(&ss, "After signal"); return 0; }
int main() { sigset_t sigset; struct sigaction sa; sa.sa_handler = Handler; sa.sa_flags = 0; // Block sigterm in the handler sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGTERM); // Block USR1 here sigemptyset(&sigset); sigaddset(&sigset, SIGUSR1); sigprocmask(SIG_BLOCK, &sigset, 0); sigaction(SIGWINCH, &sa, 0); fprintf(stderr,"Before signal1\n"); fprintf(stderr,"--------------\n"); CheckSigs(); // the kernel blocks SIGWINCH in the handler kill(0, SIGWINCH); fprintf(stderr,"After signal1\n"); fprintf(stderr,"--------------\n"); CheckSigs(); // No defer should not block SIGWINCH in handler sa.sa_flags |= SA_NODEFER; sigaction(SIGWINCH, &sa, 0); kill(0, SIGWINCH); fprintf(stderr,"After signal2\n"); fprintf(stderr,"--------------\n"); CheckSigs(); return 0; }
void Handler(int n) { fprintf(stderr,"In handler\n"); fprintf(stderr,"--------------\n"); CheckSigs(); }