struct itimerspec как неверный аргумент параметра timer_create - PullRequest
0 голосов
/ 23 января 2012

Я пытался использовать таймеры POSIX вместе с обработкой сигналов POSIX. Когда я пытаюсь выполнить код, который вы можете найти здесь, я получаю:

Ошибка timer_settime: неверный аргумент

В книге GAPIL, основанной на Advanced Linux Programming и сетевом программировании Unix, я прочитал, что это может произойти, когда внутри new_value.value вы указали отрицательное значение времени или число наносекунд выше, чем 999999999. Но я думаю, что параметры, которые я использовал, в порядке ...

#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/fcntl.h>
#include <sys/wait.h>
#include <stdbool.h>

void termination_handler(int signum)
{
    printf("Timer scaduto\n");
}

int main()
{
    timer_t timer1;
    struct sigevent sigeventStruct;
    sigeventStruct.sigev_notify = SIGEV_SIGNAL;
    sigeventStruct.sigev_signo = 10;
    if(timer_create(_POSIX_MONOTONIC_CLOCK, &sigeventStruct, &timer1) == -1)
    {
        printf( "Errore timer_create: %s\n", strerror( errno ) );
    }
    printf("timer_create eseguito\n");
    struct itimerspec tempoIniziale;
    tempoIniziale.it_value.tv_nsec = 0;

    struct itimerspec tempoFinale;
    tempoFinale.it_value.tv_nsec = 10000000;

    if(timer_settime(timer1, 0, &tempoIniziale, &tempoFinale) == -1)
    {
        printf( "Errore timer_settime: %s\n", strerror( errno ) );
    }





    struct sigaction newSigAzione, oldSigAzione;


    newSigAzione.sa_handler = termination_handler;
    //oldSigAzione.sa_handler = termination_handler;
    sigemptyset (&newSigAzione.sa_mask);

    newSigAzione.sa_flags = 0;


    sigaction (SIGEV_SIGNAL, NULL, &oldSigAzione);
    if(oldSigAzione.sa_handler != SIG_IGN)
    {
        //sigaction (SIGEV_SIGNAL, newSigAzione, NULL);
    }
    /*sigaction (SIGINT, NULL, &oldSigAzione);
    if (oldSigAzione.sa_handler != SIG_IGN)
      sigaction (SIGINT, &newSigAzione, NULL);
    sigaction (SIGHUP, NULL, &oldSigAzione);
    if (oldSigAzione.sa_handler != SIG_IGN)
      sigaction (SIGHUP, &newSigAzione, NULL);
    sigaction (SIGTERM, NULL, &oldSigAzione);
    if (oldSigAzione.sa_handler != SIG_IGN)
      sigaction (SIGTERM, &newSigAzione, NULL);*/

    /*sigaction (SIGTERM, &newSigAzione, NULL);*/

    return 0;
}

1 Ответ

3 голосов
/ 23 января 2012

_POSIX_MONOTONIC_CLOCK - это макрос тестирования функций, который сообщает вам, доступны ли в системе монотонные часы.

Доступные идентификаторы часов, которые вы можете передать в timer_create () в Linux:

CLOCK_REALTIME
  System-wide realtime clock. Setting this clock requires appropriate privileges.
CLOCK_MONOTONIC
  Clock that cannot be set and represents monotonic time since some unspecified starting point.
CLOCK_PROCESS_CPUTIME_ID
  High-resolution per-process timer from the CPU.
CLOCK_THREAD_CPUTIME_ID
  Thread-specific CPU-time clock.

Вы также должны инициализировать все элементы в struct sigevent и struct itimerspec.Например, вы не устанавливаете .tv_sec в structitimer_spec, только .tv_nsec, что приводит к значениям мусора в этих элементах.

...
memset(&sigeventStruct, 0, sizeof sigeventStruct);
...
and 
struct itimerspec tempoFinale;
memset(&tempoFinale, 0, sizeof tempoFinale);
tempoFinale.it_value.tv_nsec = 10000000;
...