#include #include #include #include #include #include using namespace std; const int NAP_TIME = 20; void CheckAndReport(sigset_t set, int signal) { if (sigismember(&set, signal)) { cout << "\tI ignored a " << strsignal(signal) << endl; } return; } void ReportOut() { sigset_t set1; sigpending(&set1); CheckAndReport(set1, SIGHUP); CheckAndReport(set1, SIGUSR1); CheckAndReport(set1, SIGUSR2); return; } void BetterHandler(int signal, siginfo_t * info, void * doNotUse) { cout << "I just handeled a " << signal << endl; return; } int main() { sigset_t set1, set2, set3; struct sigaction action; cout << "This is pid " << getpid() << endl; cout << endl; // set up a handler for sigusr1 sigemptyset(&set3); sigaddset(&set3, SIGUSR2); action.sa_sigaction = BetterHandler; action.sa_flags = SA_SIGINFO; action.sa_mask = set3; if (0 != sigaction(SIGUSR1, &action, nullptr)) { perror("sigaction"); } // put everything into one set. sigfillset(&set1); cout << "Blocking all signals (that I can)" << endl; cout << "Sleeping for so you can kill at will " << endl; sigprocmask(SIG_BLOCK, &set1, &set2); sleep(NAP_TIME); ReportOut(); cout << endl; cout << "Unblocking USR1 and USR2 " << endl; sigemptyset(&set3); sigaddset(&set3, SIGUSR1); sigaddset(&set3, SIGUSR2); sigprocmask(SIG_UNBLOCK, &set3, &set1); sleep(NAP_TIME); ReportOut(); cout << endl; cout << "Restoring the previous signanal mask " << endl; sigprocmask(SIG_SETMASK, &set2, &set1); sleep(NAP_TIME); ReportOut(); cout << "ALl Done " << endl; return 0; }