два вызова timer_settime выдают ошибку

0

Я определяю и вызываю функцию initialize_timer дважды из main. Успех или неудача зависят от порядка, в котором я называю эту же функцию дважды. То есть, когда я вызываю timer_settime, из initialize_timer, он возвращается с 0 в первый раз. Затем, во второй раз, он возвращает -1.

Поэтому повторим: если я дважды вызываю функцию initialize_timer, вызов функции timer_settime возвращается с ошибкой 1. Если я просто отменил порядок двух вызовов (см. Раздел ниже), он возвращается без ошибки (0 в качестве возвращаемого значения).

Поскольку все переменные в функции initialize_timer являются локальной переменной, я предполагаю, что ошибка в том, что я вызываю calloc в main.

Может кто-нибудь сказать мне, пожалуйста, что это за ошибка?

Почему второй вызов функции timer_setttime завершился с ошибкой в моей функции initialize_timer?

Заранее спасибо.

void initialize_timer(timer_t * tid, int seconds)
{    
    struct itimerspec * ts;
    struct sigaction *  sa;
    struct sigevent *  sev;
    ts = malloc(sizeof(struct itimerspec));
    sa = malloc(sizeof(struct sigaction));
    sev = malloc(sizeof(struct sigevent));
    if (tid == NULL)
        fprintf(stderr,"malloc");

        /* Establish handler for notification signal */

    sa->sa_flags = SA_SIGINFO;
    if(seconds == 2){
        sa->sa_sigaction = producer;
        printf("producer was created\n");
    }
    if(seconds == 6){
        sa->sa_sigaction = consumer;
        printf("consumer was created\n");
    }
    sigemptyset(&sa->sa_mask);
    if (sigaction(TIMER_SIG, sa, NULL) == -1)
        fprintf(stderr,"sigaction");

    /* Create and start one timer for each command-line argument */

    sev->sigev_notify = SIGEV_SIGNAL;    /* Notify via signal */
    sev->sigev_signo = TIMER_SIG;        /* Notify using this signal */

    itimerspec( ts, seconds);

    sev->sigev_value.sival_ptr = &tid;
    /* Allows handler to get ID of this timer */

    if (timer_create(CLOCK_REALTIME, sev, tid) == -1)
        fprintf(stderr,"timer_create");

    int error=timer_settime(tid, 0, ts, NULL) == -1;
    if (error!=0)
        fprintf(stderr,"error timer_settime");

}


int main(int argc, char *argv[])
{
    pthread_t t1, t2;
    int s = 0;
    timer_t *tidlist;
    tidlist = calloc(2, sizeof(timer_t));
    if (tidlist == NULL)
        fprintf(stderr, "malloc");

    create_threads(&t1, &t2);

    initialize_timer(tidlist + 1, 6); //initilize timer for consumer
    initialize_timer(tidlist, 2); //initilize timer for producer

    s = pthread_join(t1, NULL);
    if (s != 0)
        fprintf(stderr, "pthread_join");
    s = pthread_join(t2, NULL);
    if (s != 0)
        fprintf(stderr, "pthread_join");

    printf("glob = %d\n", glob);
    return 1;
}


void itimerspec(struct itimerspec *tsp, int seconds){
    tsp->it_value.tv_sec = seconds;
    tsp->it_value.tv_nsec = 0;
    tsp->it_interval.tv_sec = seconds;
    tsp->it_interval.tv_nsec = 0;
}
Теги:
multithreading
posix

1 ответ

0
Лучший ответ

В основном есть две ошибки:

  1. Вы дважды вызываете sigaction в том же потоке (основной поток). Это означает, что вы установите только один обработчик сигнала (последний).

  2. Вы даете timer_settime в качестве первых параметров timer_t * (указатель), а не timer_t. Вы должны включить предупреждения в своем компиляторе. Даже если вы давали не tid, но *tid вы бы дали ему такое же значение в обоих случаях, потому что ваш tidlist был создан calloc, поэтому tidlist[0] == tidlist[1] == 0.

  • 0
    tidlist [0] == tidlist [1] == 0, но позже, в инициализирующем таймере, я делаю: timer_create (CLOCK_REALTIME, sev, tid), поэтому он инициализировал tidlist [0] или tidlist [1] в зависимости от того, что я передаю функция. Так что я не уверен, что вы правы во втором пункте. Но первым моментом (и вы заметили сверху) было то, что заставило мой код работать. большое спасибо
  • 0
    У меня не было времени, чтобы отредактировать свой комментарий. нет, вы правы и по второму пункту. Это была критическая ошибка, чтобы не отменять ссылку на TID в установленное время. Но почему gcc не жалуется? Я скомпилировал код с флагом -Wall
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню