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 Mathias Bavay (site web personnel) . Évalué à 2.
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 durandal . Évalué à 1.
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.