I have implemented a POSIX timer using timer_create( ) API, and this will generate SIGUSR1 when the timer expires for which i have put a handler code. Now the problem is, if this program receives another SIGUSR1, then the same signal handler will be invoked and caught.
Is there any way to prevent this, so that the handler can catch signals only generated by the timer?
Advertisement
Answer
Will this work for you? (Modified the code from example in timer_create
man page.)
#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <signal.h> #include <time.h> #define CLOCKID CLOCK_REALTIME #define SIG SIGUSR1 timer_t timerid; static void handler(int sig, siginfo_t *si, void *uc) { if(si->si_value.sival_ptr != &timerid){ printf("Stray signaln"); } else { printf("Caught signal %d from timern", sig); } } int main(int argc, char *argv[]) { struct sigevent sev; struct itimerspec its; long long freq_nanosecs; sigset_t mask; struct sigaction sa; printf("Establishing handler for signal %dn", SIG); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = handler; sigemptyset(&sa.sa_mask); sigaction(SIG, &sa, NULL); sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIG; sev.sigev_value.sival_ptr = &timerid; timer_create(CLOCKID, &sev, &timerid); /* Start the timer */ its.it_value.tv_sec = 10; its.it_value.tv_nsec = 0; its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; timer_settime(timerid, 0, &its, NULL); sleep(100); exit(EXIT_SUCCESS); }
When signal from timer is caught Caught signal 10 from timer
will be displayed. Otherwise Stray signal
will be displayed.