Forum Programmation.c Timer, signal et appels systèmes interrompus

Posté par  .
Étiquettes : aucune
0
30
avr.
2006
Bonjour,

Je développe sur un Linux embarqué sur ARM, avec uClibc, et j'essaye d'utiliser un timer qui génèrera le signal SIGALRM toutes les 10 ms. Pour ça je configure un signal handler pour mon signal en spécifiant SA_RESTART pour éviter d'avoir des erreurs d'interruptions d'appels systèmes (EINTR). Malheureusement j'obtiens quand même régulièrement ce type d'erreurs sur certains appels plus tard dans mon application (avec tcgetattr et un ioctl). Si j'augmente le temps avant l'envoi du premier signal (it_value), ça laisse le temps de faire les appels problématiques. Donc SIGALRM et pas un autre signal est bien la cause de ces erreurs, et je ne comprends pas ce qui cloche dans mon code ci-dessous, et pourquoi SA_RESTART ne serait pas complètement pris en compte...

Merci d'avance pour toute aide ou idée... :)

void timer (int signum)
{
/* ... */
}

void system_timer (void)
{
struct itimerspec timer_spec;
struct sigaction action;
struct sigevent event;
timer_t timer_id;
int res;

/* Signal handler registration for SIGALRM */
memset (&action, 0, sizeof (action));
res = sigemptyset (&action.sa_mask);
ASSERT (res != -1);

action.sa_handler = timer;
action.sa_flags = SA_RESTART;
res = sigaction (SIGALRM, &action, NULL);
ASSERT (res != -1);

/* Timer creation */
event.sigev_notify = SIGEV_SIGNAL;
event.sigev_signo = SIGALRM;
res = timer_create (CLOCK_REALTIME, &event, &timer_id);
ASSERT (res != -1);

/* Timer configuration */
timer_spec.it_value.tv_sec = 0;
timer_spec.it_value.tv_nsec = 200000000; /* 200ms, fails with 10ms */
timer_spec.it_interval.tv_sec = 0;
timer_spec.it_interval.tv_nsec = 10000000;
res = timer_settime (timer_id, 0, &timer_spec, NULL);
ASSERT (res != -1);
}
  • # Euh... mes 0.000000002 cents

    Posté par  (site web personnel) . Évalué à 2.

    la honnetement, de tete, je seche un peu. Mais j'avais utilisé la génération de signaux de cette façon dans un autre projet il y a quelques temps, tu peux toujours regarder dans les sources pour voir comment cela se fait que mon code marchait (je me souvient avoir eu des problemes similaires q ce que tu dis, mais dans les dernieres versions, il marchait bien). Ce projet s'appelle gm4lin et tu peux telecharger les sources C a l'addresse:
    http://mathias.bavay.free.fr/software/gm4lin/index.html

    En esperant que cela puisse t'aider (des exemples de code marchant m'avaient manqués à l'époque).
    Mathias
    • [^] # Re: Euh... mes 0.000000002 cents

      Posté par  . Évalué à 1.

      Merci, j'ai regardé ça mais je ne vois pas de grosses différences dans l'initialisation du signal handler, et tu n'utilises pas SA_RESTART.

      Ce qui est bizarre, c'est que si je ne spécifie pas SA_RESTART, j'ai plus d'erreurs EINTR, avec d'autres appels. Serait-il possible que certains appels système ne soient pas redémarrables ? J'y comprends rien. ;)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.