Bonjour,

Je joue un peu avec des fonctions "a la con", qui pourraient bien ne pas me rendre la main aussi vite que je le souhaite. Du coup, je voudrai limiter leur temps d'execution, mais je n'y arrive pas... Je suis sous Linux et Unix, mais pas d'environnement Windows.

Dans l'exemple suivant, je rentre bien dans le handler, mais je ne sais pas comment faire pour que celui-ci "arrete" la fonction compute. Il est bien sur impossible dans mon cas de mettre une variable globale que je testerai dans compute(), puisque dans la vraie vie, je ne maitrise pas vraiment ce que fait cette fonction.
Bref, je cherche un moyen de sortir de compute au bout d'un temps donne, et je n'y arrive pas... Et donc si vous aviez une idee pour m'aider, ca serait super !

Merci.

SSCCE a compiler avec :
gcc -O2 -W -Wall -o test test_timer.c -lrt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/time.h>
#include <sys/types.h>
 
timer_t timerid;
 
void time_handler (void)
{
  printf ("debug in handler\n");
  timer_gettime (timerid, (struct itimerspec *)NULL);
}
 
 
void compute (void)
{
  int i = 0;
  int j = 0;
 
  while (1)
  {
    i = j++;
  }
}
 
int main (void)
{
  struct itimerspec max_time;
  struct sigaction signal_action;
  struct sigevent signal_event;
  int retour = 0;
 
  max_time.it_interval.tv_sec  = 0;
  max_time.it_interval.tv_nsec = 0;
  max_time.it_value.tv_sec     = 2;
  max_time.it_value.tv_nsec    = 0;
 
  signal_action.sa_handler = (void*)time_handler;
  sigemptyset (&signal_action.sa_mask);
  signal_action.sa_flags = 0;
 
  errno = 0;
  retour = sigaction (SIGUSR1, &signal_action, (struct sigaction *)NULL);
  if (retour == -1)
  {
    fprintf (stderr, "Error %d on sigaction : %s\n", errno, strerror(errno));
    exit (-1);
  }
 
  signal_event.sigev_notify = SIGEV_SIGNAL;
  signal_event.sigev_signo = SIGUSR1;
 
  if (timer_create (CLOCK_REALTIME, &signal_event, &timerid) == -1)
  {
    fprintf (stderr, "Error %d on timer creation : %s\n", errno, strerror(errno));
    exit (-1);
  }
 
  printf ("before settime\n");
  timer_settime (timerid, 0, &max_time, (struct itimerspec*)NULL);
 
  compute();
  printf ("after compute\n");
 
  return EXIT_SUCCESS;
}