Я пытаюсь передать указатель на обработчик таймера с помощью sigevent
, а затем распечатать его с помощью write()
. Я не могу сослаться на него в обработчике таймера. Смотрите ниже комментарии:
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
static void timerHandler( int sig, siginfo_t *si, void *uc )
{
char * c;
c = (char *) si->si_value.sival_ptr;
write(1,c,1); /* Prints nothing */
char h = (char) 'x';
write(1,&h,1); /* Prints ok */
char f = (char) *c;
write(1,&f,1); /* Segmentation Fault */
}
int main(void)
{
static char a = 'k';
write(1,(char *) &a,1); /* Prints ok */
struct sigevent te;
struct itimerspec its;
struct sigaction sa;
timer_t timerID;
int sigNo = SIGRTMIN;
/* Set up signal handler. */
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timerHandler;
sigemptyset(&sa.sa_mask);
if (sigaction(sigNo, &sa, NULL) == -1) {
perror("sigaction");
}
/* Set and enable alarm */
te.sigev_notify = SIGEV_SIGNAL;
te.sigev_signo = sigNo;
te.sigev_value.sival_ptr = &a;
te.sigev_value.sival_int = 5;
timer_create(CLOCK_REALTIME, &te, &timerID);
/* One Second Interval */
its.it_interval.tv_sec = 1;
its.it_interval.tv_nsec = 0;
its.it_value.tv_sec = 1;
its.it_value.tv_nsec = 0;
timer_settime(timerID, 0, &its, NULL);
while(1);;
}
Что я делаю не так? Я собираю с: /usr/bin/gcc-5 main.c -o main -lrt