//#include #include #include #include #include //#include volatile int child_blocked; volatile sig_atomic_t got_it; #if defined(__i386) #define HAVE_LEGACY void handle(int signal, struct sigcontext sc) { child_blocked = sc.oldmask == (1 << (SIGCHLD-1)); got_it = 1; } #elif defined(__amd64) #define HAVE_LEGACY void handle(int signal, struct ucontext uc) { child_blocked = ((struct sigcontext*)&uc.uc_mcontext)->oldmask == (1 << (SIGCHLD-1)); got_it = 1; } #elif defined(__mc68000) #define HAVE_LEGACY void handle(int signal, int code, struct sigcontext *sc) { child_blocked = sc->sc_mask == (1 << (SIGCHLD-1)); got_it = 1; } #endif void handle_siginfo(int signal, siginfo_t * info, void *ctx) { child_blocked = sigismember(&((ucontext_t*)ctx)->uc_sigmask, SIGCHLD); got_it = 1; } int main(void) { struct sigaction sa; sigset_t set; #ifdef HAVE_LEGACY sa.sa_flags = 0; sa.sa_handler = handle; sigemptyset(&sa.sa_mask); sigaction(SIGUSR1, &sa, NULL); sigemptyset(&set); sigaddset(&set, SIGCHLD); sigprocmask(SIG_SETMASK, &set, NULL); got_it = 0; kill(getpid(), SIGUSR1); while(got_it == 0); sigprocmask(SIG_SETMASK, NULL, &set); printf("%d %d\n", child_blocked, sigismember(&set, SIGCHLD)); #endif got_it = 0; sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = handle_siginfo; sigaction(SIGUSR1, &sa, NULL); sigemptyset(&set); sigaddset(&set, SIGCHLD); sigprocmask(SIG_SETMASK, &set, NULL); got_it = 0; kill(getpid(), SIGUSR1); while(got_it == 0); sigprocmask(SIG_SETMASK, NULL, &set); printf("%d %d\n", child_blocked, sigismember(&set, SIGCHLD)); }