fonction alarm(), gestion d'un timeout

BoTTom |    Changer de couleur
 
 ILE permet d'utiliser en RPG 4 des fonctions écrites ou destinées au C/400.
 
  dont une fonction alarm() de gestion de timeout
 
 
 Cette fonction prend la forme suivante
 
 Alarm
 ..................................................................
 : D alarm           PR            10U 0 extproc('alarm')         :
 : D   secs                        10U 0 value                    :
 ..................................................................
 
 par exemple
 
   /free
          alarm(30);
          rc = accept(sock: addr: size);
          alarm(0);
   /end-free
 si la réponse de la fonction accept(), dépasse 30s un signal est envoyé.


|    Changer de couleur
 
Qu'est-ce qu'un signal ?
 
c'est un message (souvent d'erreur),envoyé à un pgm (ou à un thread).
 
le thread doit se déclaré à l'écoute d'un tel message,en lui associant
 un signal handler (routine à appeller en cas de signal)
 
l'écoute d'un signal est enregistrée dans un "signal set"
 
 
Tout cela est mis en place par :
 
   Qp0sEnableSignals() 
 
   puis  sigemptyset() initialise le signal set
         sigaddset()   ajoute un signal au signal set
 
   et enfin, sigaction() indique les coordonnées d'une procédure
                           à activer, liée au signal recu.
 
 


|    Changer de couleur
 
Enabled
.......................................................................
:D Qp0sEnableSignals...                                               :
:D                 PR            10I 0 extproc('Qp0sEnableSignals')   :
:.....................................................................:
 
SigemptySet
.......................................................................
:D sigset_t        s             20U 0 based(ptr_fictif)              :
:                                                                     :
:D sigemptyset     PR            10I 0 extproc('sigemptyset')         :
:D  set                                like(sigset_t)                 :
:.....................................................................:
 
SigaddSet
.......................................................................
:D sigaddset       PR            10I 0 extproc('sigaddset')           :
:D   set                               like(sigset_t)                 :
:D   signo                       10I 0 value                          :
:.....................................................................:
 


|    Changer de couleur
Sigaction
 
........................................................................
:D sigaction_t     ds                  qualified                       :
:D                                     align                           :
:D                                     based(ptr_fictif)               :
:D   sa_handler                    *   procptr                         :
:D   sa_mask                           like(sigset_t)                  :
:D   sa_flags                    10I 0                                 :
:D   sa_sigaction                  *   procptr                         :
:                                                                      :
:D sigaction       PR                  extproc('sigaction')            :
:D   sig                         10I 0 value                           :
:D   act                               likeds(sigaction_t) const       :
:D                                     options(*omit)                  :
:D   oact                              likeds(sigaction_t)             :
:D                                     options(*omit)                  :
:......................................................................:
 
 sa_handler devant contenir le pointeur d'une procédure: %PADDR()
 
 


|    Changer de couleur
Exemple
 
   *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   * Set up a signal handler to receive the SIGALRM signal
   *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  P init_signals    B
  D init_signals    PI
  D act             ds                  likeds(sigaction_t)
   /free
       Qp0sEnableSignals();
       sigemptyset(act.sa_mask);
       sigaddset(act.sa_mask: SIGALRM);
       act.sa_handler   = %paddr(alarm_recue);
       act.sa_flags     = 0;
       act.sa_sigaction = *NULL;
       sigaction(SIGALRM: act: *omit);
   /end-free
  P                 E
 
 SIGALRM contient la valeur 14
 
 voici la liste des signaux possibles :


|    Changer de couleur
 
 D SIGABRT         C                   const(1)
 D SIGIOT          C                   const(1)
 D SIGLOST         C                   const(1)
 D SIGFPE          C                   const(2)
 D SIGILL          C                   const(3)
 D SIGINT          C                   const(4)
 D SIGSEGV         C                   const(5)
 D SIGTERM         C                   const(6)
 D SIGUSR1         C                   const(7)
 D SIGUSR2         C                   const(8)
 D SIGIO           C                   const(9)
 D SIGAIO          C                   const(9)
 D SIGPTY          C                   const(9)
 D SIGALL          C                   const(10)
 D SIGOTHER        C                   const(11)
 D SIGKILL         C                   const(12)
 D SIGPIPE         C                   const(13)
 D SIGALRM         C                   const(14)
 D SIGHUP          C                   const(15)
 D SIGQUIT         C                   const(16)
 


|    Changer de couleur
 D SIGSTOP         C                   const(17)
 D SIGTSTP         C                   const(18)
 D SIGCONT         C                   const(19)
 D SIGCHLD         C                   const(20)
 D SIGCLD          C                   const(20)
 D SIGTTIN         C                   const(21)
 D SIGTTOU         C                   const(22)
 D SIGURG          C                   const(23)
 D SIGIOINT        C                   const(23)
 D SIGPOLL         C                   const(24)
 D SIGPCANCEL      C                   const(25)
 D SIGPALRM        C                   const(26)
 D SIGBUS          C                   const(32)
 D SIGDANGER       C                   const(33)
 D SIGPRE          C                   const(34)
 D SIGSYS          C                   const(35)
 D SIGTRAP         C                   const(36)
 D SIGPROF         C                   const(37)
 D SIGVTALRM       C                   const(38)
 D SIGXCPU         C                   const(39)
 D SIGXFSZ         C                   const(40)
 


|    Changer de couleur
 
sinon, la procédure appellée (le handler)
-----
 
 P alarm_recue     B
 D alarm_recue     PI
 D   signo                       10I 0 value
 
  /free
     // vous n'êts pas obligé de faire qqchose
     // la fonction "__errno" retournera de toutes façons
     //  EINTR ("interrupted by signal"= 3407) quand le signal
     //  sera recu !
 
     //
     //  vous pouvez, ceci dit, gérer un flag
     //  ou faire du menage si besoin
     //
  /end-free
 
 P                 E




©AF400