///////////////////////////////////////////////////////////////////////////// // Rev 11/12/2003 // // // SIGNAL.C // -------- // // // Sylvain MARECHAL - sylvain.marechal1@libertysurf.fr ///////////////////////////////////////////////////////////////////////////// // // Show signal usage // ///////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #define SIG_STOP_CHILD SIGUSR1 main() { pid_t pid; sigset_t newmask, oldmask; if ((pid = fork()) == 0) { /*Child*/ struct sigaction action; void catchit(); sigemptyset(&newmask); sigaddset(&newmask, SIG_STOP_CHILD); sigprocmask(SIG_BLOCK, &newmask, &oldmask); action.sa_flags = 0; action.sa_handler = catchit; if (sigaction(SIG_STOP_CHILD, &action, NULL) == -1) { perror("sigusr: sigaction"); _exit(1); } printf( "Signal is blocked\n" ); sleep(5); printf( "Signal is unblocked\n" ); sigprocmask(SIG_UNBLOCK, &newmask, NULL); sleep(5); /*sigsuspend(&oldmask);*/ printf( "Exiting ...\n" ); } else { /* Parent */ int stat; int i; sleep(1); for( i = 0; i < 10; i ++ ) kill(pid, SIG_STOP_CHILD); pid = wait(&stat); printf("Child exit status = %d\n", WEXITSTATUS(stat)); _exit(0); } } void catchit(int signo) { printf("Signal %d received from parent\n", signo); /*_exit(0);*/ }