This is test2.c in view mode; [Download] [Up]
/* * FILE: A test of pthread_sigaction * * Launch this program and then issue kill -<signo> <pid>. I run through * all of the signals from 1 - 31. Signals 5 (SIGTRAP) and 9 (SIGKILL) * terminate the process because they can not be handled. Signal 26 * is ignored completely because the thread's runtime won't let any * one mess with SIGVTALRM. Signals #17 (SIGCHLD) and #18 (SIGCONT) * are not delivered to the process. * * Also, try this one: Start up the process then send it a SIGSTOP (#19). * Next send it a SIGINT (#2). Nothing should happen because the process * is asleep. Next, issue a SIGCONT (#18). Notice that the SIGINT is * delivered upon wakeup from the suspended state. Just as it's supposed * to be. */ #include <pthread.h> #include <stdio.h> #include <utils.h> extern int getpid( void ); void handler( int sig ) { pthread_lock_global_np(); printf("Caught %d %s in handler!\n", sig, sys_signame[sig] ); pthread_unlock_global_np(); } int main( int argc, char *argv[] ) { struct sigaction act; struct timespec ts = { 1, 0 }; int i, nreps = 20; printf("pid %d: ", getpid()); fflush( NULL ); for(i = 1; i < NSIG; i++ ) { act.sa_handler = handler; act.sa_mask = (SA_RESTART); sigemptyset( &act.sa_mask ); pthread_sigaction_np( i, &act, NULL ); } /* * Sleep for 0.5 seconds, wake-up, then go back to sleep. Do this * 5 times or until the process takes a kill -9. */ while( nreps > 0 ) { pthread_delay_np( &ts ); nreps -= 1; printf("."); fflush(NULL); } printf(" done\n"); return(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.