C SIGEVENT sival_ptr分段故障

C SIGEVENT sival_ptr分段故障,c,timer,posix,C,Timer,Posix,我试图使用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;

我试图使用
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);;
}
#包括
#包括
#包括
#包括
静态void timerHandler(int-sig、siginfo\u-t*si、void*uc)
{
char*c;
c=(char*)si->si_value.sival_ptr;
写(1,c,1);/*不打印任何内容*/
字符h=(字符)'x';
写入(1,&h,1);/*打印正常*/
字符f=(字符)*c;
写入(1,&f,1);/*分段错误*/
}
内部主(空)
{
静态字符a='k';
写入(1,(字符*)&a,1);/*打印正常*/
结构sigte;
结构itimerspec its;
struct-sigaction-sa;
计时器\u t timerID;
int sigNo=SIGRTMIN;
/*设置信号处理器*/
sa.sa_flags=sa_SIGINFO;
sa.sa_sigaction=timerHandler;
sigemptyset(和sa.sa_面具);
if(sigaction(sigNo,&sa,NULL)=-1){
佩罗尔(“sigaction”);
}
/*设置并启用报警*/
te.sigev_notify=sigev_信号;
te.sigev_signo=signo;
te.sigev_value.sival_ptr=&a;
te.sigev_value.sival_int=5;
计时器\u创建(时钟\u实时,&te,&timerID);
/*一秒间隔*/
its.it_interval.tv_sec=1;
its.it\u interval.tv\u nsec=0;
its.it_value.tv_sec=1;
its.it\u value.tv\u nsec=0;
timer_settime(timerID,0,&its,NULL);
而(一);;;
}

我做错了什么?我正在编译:
/usr/bin/gcc-5 main.c-o main-lrt
sigev\u value
是一个联合体:

typedef union sigval {
    int sival_int;
    void *sival_ptr;
} sigval_t;
您可以使用
sival_ptr
sival_int
,但不能同时使用两者

要修复,请删除以下行:

te.sigev_value.sival_int = 5;

为了调试测试
si->si_value.sival_ptr用于
NULL