SIGEVENT sival_ptr Ошибка сегментации - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь передать указатель на обработчик таймера с помощью 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

1 Ответ

0 голосов
/ 02 июля 2018

sigev_value является объединением:

typedef union sigval {
    int sival_int;
    void *sival_ptr;
} sigval_t;

Вы можете использовать либо sival_ptr, либо sival_int, но не оба одновременно.

Чтобы исправить, удалите следующую строку:

te.sigev_value.sival_int = 5;
...