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