Я определяю и вызываю функцию 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;
}
В основном есть две ошибки:
Вы дважды вызываете sigaction
в том же потоке (основной поток). Это означает, что вы установите только один обработчик сигнала (последний).
Вы даете timer_settime в качестве первых параметров timer_t *
(указатель), а не timer_t
. Вы должны включить предупреждения в своем компиляторе. Даже если вы давали не tid
, но *tid
вы бы дали ему такое же значение в обоих случаях, потому что ваш tidlist
был создан calloc
, поэтому tidlist[0] == tidlist[1] == 0
.