Open System Services Programmer's Guide
Example 66 Handling SIGALRM Signals
/*Program demonstrating handling the SIGALRM signal */
/** You must also export the environment variable **/
/** SPT_THREAD_AWARE_SIGNAL **/
/** to 1 to enable thread-aware signal handling **/
#define SPT_THREAD_AWARE /** enables thread aware behavior and maps **/
 /** functions other than alarm() and signal() to their spt_ versions**/
#define SPT_THREAD_SIGNAL /** maps alarm() to spt_alarm()**/
#include <spthread.h>
void sighand1(int);
void sighand2(int);
struct sigaction sigact_t;
int rc;
void *do_work(void *arg)
{
 sigset_t set;
 sigfillset(&set);
 sigdelset(&set,SIGALRM);
 sigact_t.sa_handler = sighand1; 
 rc = spt_sigaction(SIGALRM,&sigact_t,NULL);
 printf("\n spt_sigaction for thread1 returned %d\n",rc);
 alarm(5);
 rc = spt_sigsuspend(&set);
 printf("\nspt_sigsuspend for thread1 returned %d\n",rc);
 return NULL;
}
void *do_work1(void *arg)
{
 sigset_t set;
 int sig;
 sigemptyset(&set);
 sigaddset(&set,SIGALRM);
 sigact_t.sa_handler = sighand2;
 rc=spt_sigaction(SIGALRM,&sigact_t,NULL);
 printf("\nspt_sigaction for thread2 returned %d\n",rc);
 alarm(6);
 rc=spt_sigwait(&set,&sig);
 printf("\nspt_sigwait returned %d\n",rc);
 printf("\nspt_sigwait for thread2 returned for signal %d\n",sig);
 return NULL;
}
int main()
{
 pthread_t tid1,tid2;
 pthread_create(&tid1,NULL,do_work,NULL);
 pthread_create(&tid2,NULL,do_work1,NULL);
 sched_yield();
 pthread_join(tid1,NULL);
 pthread_join(tid2,NULL);
 printf("\nMain Completed\n");
}
void sighand1(int signo)
{
 printf("Signal received for thread1 is %d\n",signo);
}
void sighand2(int signo)
{
 printf("Signal received is %d\n",signo);
}
326 Using the Standard POSIX Threads Library










