Open System Services Programmer's Guide
Example 89 Handling SIGALRM Signals
/*Program demonstrating handling the SIGALRM signal */
#define _PUT_MODEL_ /** enables thread aware behavior **/
#include <pthread.h>
#include <signal.h>
#include <unistd.h>
#include “myio.h” /** contains my_printf which is process-blocking**/
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 = sigaction(SIGALRM,&sigact_t,NULL);
my_printf("\n sigaction for thread1 returned %d\n",rc);
alarm(5);
rc = sigsuspend(&set);
my_printf("\nsigsuspend 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=sigaction(SIGALRM,&sigact_t,NULL);
my_printf("\nsigaction for thread2 returned %d\n",rc);
alarm(6);
rc=sigwait(&set,&sig);
my_printf("\nsigwait returned %d\n",rc);
my_printf("\nsigwait 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);
my_printf("\nMain Completed\n");
}
void sighand1(int signo)
{
my_printf("Signal received for thread1 is %d\n",signo);
}
void sighand2(int signo)
{
Signals and Signal Handling 395